ConvertEntity on Search
sandman202 Oct 21, 2008 9:06 PMI posted this once before a few weeks ago and made a couple of mistakes when I posted. Sorry about the previous errors. Hopefuly, someone has a solution to this.
I upgraded my seam to version jboss-seam-2.1.0-SNAPSHOT taken on 10/13/08.
I have designed my search/listing similar to that described in the Seam in Action
book. This particular has multiple convertEntity and a single convertEnum. When I apply the convertEntity and convertEnum to my EditionEdit.xhtml, everything works fine. However, when used in the EditionList.xhtml, the convertEnum works, but the convertEntity keeps giving me the following error:
13:31:05,638 WARN [SeamPhaseListener] uncaught exception, passing to exception handler javax.el.ELException: java.lang.IllegalArgumentException: argument type mismatch at javax.el.BeanELResolver.setValue(BeanELResolver.java:116) at javax.el.CompositeELResolver.setValue(CompositeELResolver.java:68) at com.sun.faces.el.FacesCompositeELResolver.setValue(FacesCompositeELResolver.java:93) at org.jboss.el.parser.AstPropertySuffix.setValue(AstPropertySuffix.java:73) at org.jboss.el.parser.AstValue.setValue(AstValue.java:84) at org.jboss.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249) at org.jboss.seam.core.Expressions$1.setValue(Expressions.java:117) at org.jboss.seam.navigation.Pages.applyConvertedValidatedValuesToModel(Pages.java:840) at org.jboss.seam.navigation.Pages.postRestore(Pages.java:439) at org.jboss.seam.jsf.SeamPhaseListener.postRestorePage(SeamPhaseListener.java:546) at org.jboss.seam.jsf.SeamPhaseListener.afterRestoreView(SeamPhaseListener.java:392) at org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:228) at org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:194) at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:280) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83) at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:38) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:90) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:177) at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:267) at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:380) at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:507) at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:51) at org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69) at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) at java.lang.Thread.run(Unknown Source) Caused by: java.lang.IllegalArgumentException: argument type mismatch at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at javax.el.BeanELResolver.setValue(BeanELResolver.java:108) ... 56 more 13:31:05,748 ERROR [CachedConnectionValve] Application error: Faces Servlet did not complete its transaction 13:31:06,654 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jboss-seam-excel.jar!/META-INF/seam-excel.taglib.xml 13:31:06,670 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jboss-seam-mail.jar!/META-INF/seam-mail.taglib.xml 13:31:06,670 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jboss-seam-pdf.jar!/META-INF/seam-pdf.taglib.xml 13:31:06,685 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jboss-seam-rss.jar!/META-INF/seam-rss.taglib.xml 13:31:06,685 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jboss-seam-ui.jar!/META-INF/s.taglib.xml 13:31:06,701 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-core.taglib.xml 13:31:06,701 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-html.taglib.xml 13:31:06,701 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jsf-ui.taglib.xml 13:31:06,717 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-core.taglib.xml 13:31:06,732 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/jsf-facelets.jar!/META-INF/jstl-fn.taglib.xml 13:31:06,732 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/richfaces-ui.jar!/META-INF/a4j.taglib.xml 13:31:06,748 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/richfaces-ui.jar!/META-INF/ajax4jsf.taglib.xml 13:31:06,748 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/richfaces-ui.jar!/META-INF/jsp.taglib.xml 13:31:06,764 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/richfaces-ui.jar!/META-INF/rich.taglib.xml 13:31:06,779 ERROR [STDERR] Oct 21, 2008 1:31:06 PM com.sun.facelets.compiler.TagLibraryConfig loadImplicit INFO: Added Library from: jar:file:/C:/jboss/jboss-4.2.2.GA/server/default/deploy/artwork.ear/artwork.war/WEB-INF/lib/richfaces-ui.jar!/META-INF/richfaces.taglib.xml
EditionList.xhtml
<ui:define name="body">
<h:form id="editionSearch" styleClass="edit">
<rich:simpleTogglePanel label="Edition Search Parameters" switchType="ajax">
<s:decorate id="itemDecoration" template="layout/display.xhtml">
<ui:define name="label">Item</ui:define>
<h:selectOneMenu id="item"
styleClass="selectOneMenu"
value="#{itemHome.itemId}">
<s:selectItems value="#{itemList.resultList}" var="_item" label="#{_item.name}"
itemValue="#{_item.id}" noSelectionLabel=" "/>
<a:support event="onblur" reRender="itemDecoration" ajaxSingle="true" bypassUpdates="true"/>
</h:selectOneMenu>
</s:decorate>
<s:decorate id="mediumDecoration" template="layout/display.xhtml">
<ui:define name="label">Medium</ui:define>
<h:selectOneMenu id="codeMedium"
styleClass="selectOneMenu"
value="#{editionList.edition.medium}">
<s:selectItems value="#{codeList.mediumCodes}" var="_codeMedium" label="#{_codeMedium.code}"
noSelectionLabel=" "/>
<s:convertEntity />
</h:selectOneMenu>
</s:decorate>
<s:decorate id="limitedDecoration" template="layout/display.xhtml">
<ui:define name="label">Limited</ui:define>
<h:selectOneMenu id="limitedBooleanType"
styleClass="selectOneMenu"
value="#{editionList.edition.limited}">
<s:selectItems value="#{codeList.booleanTypes}" var="_booleanType" label="#{_booleanType.value}"
noSelectionLabel=" "/>
<s:convertEnum />
</h:selectOneMenu>
</s:decorate>
</rich:simpleTogglePanel>
<div class="actionButtons">
<h:commandButton id="search" value="Search" action="/EditionList.xhtml"/>
</div>
</h:form>
<rich:panel>
<f:facet name="header">Edition Search Results</f:facet>
<ui:include src="EditionTable.xhtml">
<ui:param name="editionFrom" value="EditionList"/>
</ui:include>
</rich:panel>
<s:div styleClass="actionButtons" rendered="#{empty from}">
<s:button id="done"
value="Create Edition"
view="/EditionEdit.xhtml">
<f:param name="editionId"/>
</s:button>
</s:div>
</ui:define>
EditionList.java
@Name("editionList")
public class EditionList extends EntityQuery<Edition>
{
private static final long serialVersionUID = -311723806447384135L;
private static final String[] RESTRICTIONS = {
"edition.item.id = #{itemHome.itemId}",
"edition.medium = #{editionList.edition.medium}",
"edition.limited = #{editionList.edition.limited}",
};
private Edition edition = new Edition();
public EditionList() {
Code medium = new Code();
edition.setMedium(medium);
}
@Override
public String getEjbql() {
return "select edition from Edition edition";
}
@Override
public Integer getMaxResults() {
return 25;
}
public Edition getEdition() {
return edition;
}
@Override
public List<String> getRestrictionExpressionStrings() {
return Arrays.asList(RESTRICTIONS);
}
@Override
public String getOrder() {
if (super.getOrder() == null) {
setOrder("item.description asc");
}
return super.getOrder();
}
}
EditionList.page.xml
<page xmlns="http://jboss.com/products/seam/pages"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.com/products/seam/pages http://jboss.com/products/seam/pages-2.0.xsd">
<param name="firstResult" value="#{editionList.firstResult}"/>
<param name="editionListOrder" value="#{editionList.order}"/>
<param name="from"/>
<param name="item" value="#{editionList.edition.item}"/>
<param name="medium" value="#{editionList.edition.medium}"/>
<param name="limited" value="#{editionList.edition.limited}"/>
</page>
It seems that the error is thrown on the medium param.
If I make changes to pass the id rather than the entity, there is not any error, but the SQL does not use the restriction.
EditionList.xhtml
<s:decorate id="mediumDecoration" template="layout/display.xhtml">
<ui:define name="label">Medium</ui:define>
<h:selectOneMenu id="codeMedium"
styleClass="selectOneMenu"
value="#{editionList.edition.medium.id}">
<s:selectItems value="#{codeList.mediumCodes}" var="_codeMedium" label="#{_codeMedium.code}"
itemValue="#{_codeMedium.id}"
noSelectionLabel=" "/>
</h:selectOneMenu>
</s:decorate>
EditionList.page.xml
<param name="firstResult" value="#{editionList.firstResult}"/>
<param name="editionListOrder" value="#{editionList.order}"/>
<param name="from"/>
<param name="item" value="#{editionList.edition.item}"/>
<param name="medium" value="#{editionList.edition.medium.id}"/>
<param name="limited" value="#{editionList.edition.limited}"/>
EditionList.java
@Name("editionList")
public class EditionList extends EntityQuery<Edition>
{
private static final long serialVersionUID = -311723806447384135L;
private static final String[] RESTRICTIONS = {
"edition.item.id = #{itemHome.itemId}",
"edition.medium.id = #{editionList.edition.medium.id}",
"edition.limited = #{editionList.edition.limited}",
};
private Edition edition = new Edition();
public EditionList() {
Code medium = new Code();
edition.setMedium(medium);
}
@Override
public String getEjbql() {
return "select edition from Edition edition";
}
@Override
public Integer getMaxResults() {
return 25;
}
public Edition getEdition() {
return edition;
}
@Override
public List<String> getRestrictionExpressionStrings() {
return Arrays.asList(RESTRICTIONS);
}
@Override
public String getOrder() {
if (super.getOrder() == null) {
setOrder("item.description asc");
}
return super.getOrder();
}
}
My questions are:
1. Am I missing something in my code to get the convertEntity to work?
2. The getRestrictions method was changed to use getRestrictionExpressionStrings method. If I were to pass the id, how do I add this to my restriction list? Before I updated seam, the getRestrictions was being called every time I pressed the search button, but with the getRestrictionExpressionStrings method, it is not being called each time. This leads me to believe either something else changed, I am using the wrong method to add more restrictions or I am not using the param correctly.
3. If neither convertEntity nor passing the id is the proper way, then what would work?
Any and all comments would be appreciated. I am sure someone out there has encountered this problem and has a solution.
Scott