jsf 2 - javax.el.PropertyNotFoundException when submitting ui:repeat with conditionally rendered properties of different subclasses -
in backing-bean have collection of objects of different subclasses sharing common interface. inside view, ui:repeat
iterates on collection. inside loop, different properties have rendered depending on concrete implementation of interface.
i reduced problem following backing bean:
@named @sessionscoped public class dummybean implements serializable { private list<type> objects = new arraylist<type>(); public void add1() { objects.add(new type1()); } public void add2() { objects.add(new type2()); } public void remove(type o) { objects.remove(o); } // getter. }
and following type
implementations added methods add1
, add2
. have common properties, may have different ones, such gettype1onlymethod()
in below example:
public class type1 implements type { @override public string gettype() { return "1"; } public list<string> gettype1onlymethod() { return arrays.aslist("only1", "only2"); } // ... }
public class type2 implements type { @override public string gettype() { return "2"; } // ... }
in view want iterate on objects stored in dummybean
, display contents. depending on concrete type of object, method implemented in class type1
may called using rendered
-attribute conditional rendering:
<h:form id="dummyform"> <ui:repeat value="#{dummybean.objects}" var="_obj" > <h:outputtext value="type of object #{_obj.type}." /> <h:panelgroup rendered="#{_obj.type eq '1'}"> <ui:repeat value="#{_obj.type1onlymethod}" var="_oneonlyobject" varstatus="_status" > <h:outputtext value="#{_oneonlyobject}" /> </ui:repeat> </h:panelgroup> <h:commandlink value="remove" action="#{dummybean.remove(_obj)}"> <f:ajax render="dummyform" /> </h:commandlink> <br/> </ui:repeat> <h:commandlink value="add1" action="#{dummybean.add1}"> <f:ajax render="dummyform" /> </h:commandlink> <br/> <h:commandlink value="add2" action="#{dummybean.add2}"> <f:ajax render="dummyform" /> </h:commandlink> </h:form>
using h:commandlink
s on page can add , remove type1
objects @ will. if add type2
objects, rendered expected. when try remove 1 of type2
objects, exception in render-response phase (nevertheless if there other elements in list or not):
2014-03-24 15:42:46,754 severe [javax.enterprise.resource.webcontainer.jsf.application] (default task-11) error rendering view[/transition/begintestsite.xhtml]: javax.el.propertynotfoundexception: /transition/begintestsite.xhtml @23,96 value="#{_obj.type1onlymethod}": class 'at.co.xss.type2' not have property 'type1onlymethod'. @ com.sun.faces.facelets.el.tagvalueexpression.getvalue(tagvalueexpression.java:111) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.facelets.component.uirepeat.getvalue(uirepeat.java:279) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.facelets.component.uirepeat.getdatamodel(uirepeat.java:255) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.facelets.component.uirepeat.setindex(uirepeat.java:523) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.facelets.component.uirepeat.dovisitchildren(uirepeat.java:790) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.facelets.component.uirepeat.visittree(uirepeat.java:748) [jsf-impl-2.2.5-jbossorg-3.jar:] @ javax.faces.component.uicomponent.visittree(uicomponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ com.sun.faces.facelets.component.uirepeat.visittree(uirepeat.java:754) [jsf-impl-2.2.5-jbossorg-3.jar:] @ javax.faces.component.uicomponent.visittree(uicomponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.component.uiform.visittree(uiform.java:371) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.component.uicomponent.visittree(uicomponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.component.uicomponent.visittree(uicomponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ com.sun.faces.application.view.faceletpartialstatemanagementstrategy.saveview(faceletpartialstatemanagementstrategy.java:472) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.application.statemanagerimpl.saveview(statemanagerimpl.java:89) [jsf-impl-2.2.5-jbossorg-3.jar:] @ javax.faces.application.statemanager.getviewstate(statemanager.java:593) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ com.sun.faces.context.partialviewcontextimpl.renderstate(partialviewcontextimpl.java:486) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.context.partialviewcontextimpl.processpartial(partialviewcontextimpl.java:328) [jsf-impl-2.2.5-jbossorg-3.jar:] @ javax.faces.context.partialviewcontextwrapper.processpartial(partialviewcontextwrapper.java:219) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ org.primefaces.context.primepartialviewcontext.processpartial(primepartialviewcontext.java:57) [primefaces-4.0.jar:4.0] @ org.richfaces.context.extendedpartialviewcontextimpl.processpartial(extendedpartialviewcontextimpl.java:218) [richfaces-core-impl-4.3.5.final.jar:4.3.5.final] @ javax.faces.component.uiviewroot.encodechildren(uiviewroot.java:1004) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.component.uicomponent.encodeall(uicomponent.java:1856) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ com.sun.faces.application.view.faceletviewhandlingstrategy.renderview(faceletviewhandlingstrategy.java:435) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.application.view.multiviewhandler.renderview(multiviewhandler.java:133) [jsf-impl-2.2.5-jbossorg-3.jar:] @ javax.faces.application.viewhandlerwrapper.renderview(viewhandlerwrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.application.viewhandlerwrapper.renderview(viewhandlerwrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.application.viewhandlerwrapper.renderview(viewhandlerwrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ javax.faces.application.viewhandlerwrapper.renderview(viewhandlerwrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ com.sun.faces.lifecycle.renderresponsephase.execute(renderresponsephase.java:120) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.lifecycle.phase.dophase(phase.java:101) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.lifecycle.lifecycleimpl.render(lifecycleimpl.java:219) [jsf-impl-2.2.5-jbossorg-3.jar:] @ javax.faces.webapp.facesservlet.service(facesservlet.java:647) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] @ io.undertow.servlet.handlers.servlethandler.handlerequest(servlethandler.java:85) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.filterhandler$filterchainimpl.dofilter(filterhandler.java:130) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ org.apache.shiro.web.servlet.abstractshirofilter.executechain(abstractshirofilter.java:449) [shiro-web-1.2.2.jar:1.2.2] @ org.apache.shiro.web.servlet.abstractshirofilter$1.call(abstractshirofilter.java:365) [shiro-web-1.2.2.jar:1.2.2] @ org.apache.shiro.subject.support.subjectcallable.docall(subjectcallable.java:90) [shiro-core-1.2.2.jar:1.2.2] @ org.apache.shiro.subject.support.subjectcallable.call(subjectcallable.java:83) [shiro-core-1.2.2.jar:1.2.2] @ org.apache.shiro.subject.support.delegatingsubject.execute(delegatingsubject.java:383) [shiro-core-1.2.2.jar:1.2.2] @ org.apache.shiro.web.servlet.abstractshirofilter.dofilterinternal(abstractshirofilter.java:362) [shiro-web-1.2.2.jar:1.2.2] @ org.apache.shiro.web.servlet.onceperrequestfilter.dofilter(onceperrequestfilter.java:125) [shiro-web-1.2.2.jar:1.2.2] @ io.undertow.servlet.core.managedfilter.dofilter(managedfilter.java:56) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.filterhandler$filterchainimpl.dofilter(filterhandler.java:132) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.filterhandler.handlerequest(filterhandler.java:85) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.security.servletsecurityrolehandler.handlerequest(servletsecurityrolehandler.java:61) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.servletdispatchinghandler.handlerequest(servletdispatchinghandler.java:36) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ org.wildfly.extension.undertow.security.securitycontextassociationhandler.handlerequest(securitycontextassociationhandler.java:78) @ io.undertow.server.handlers.predicatehandler.handlerequest(predicatehandler.java:25) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.security.sslinformationassociationhandler.handlerequest(sslinformationassociationhandler.java:113) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.security.handlers.authenticationcallhandler.handlerequest(authenticationcallhandler.java:52) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.security.handlers.abstractconfidentialityhandler.handlerequest(abstractconfidentialityhandler.java:45) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.security.servletconfidentialityconstrainthandler.handlerequest(servletconfidentialityconstrainthandler.java:61) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.security.cachedauthenticatedsessionhandler.handlerequest(cachedauthenticatedsessionhandler.java:70) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.security.handlers.securityinitialhandler.handlerequest(securityinitialhandler.java:76) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.server.handlers.predicatehandler.handlerequest(predicatehandler.java:25) [undertow-core-1.0.0.final.jar:1.0.0.final] @ org.wildfly.extension.undertow.security.jacc.jacccontextidhandler.handlerequest(jacccontextidhandler.java:61) @ io.undertow.server.handlers.predicatehandler.handlerequest(predicatehandler.java:25) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.server.handlers.predicatehandler.handlerequest(predicatehandler.java:25) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.servletinitialhandler.handlefirstrequest(servletinitialhandler.java:240) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.servletinitialhandler.dispatchrequest(servletinitialhandler.java:227) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.servletinitialhandler.access$000(servletinitialhandler.java:73) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.servlet.handlers.servletinitialhandler$1.handlerequest(servletinitialhandler.java:146) [undertow-servlet-1.0.0.final.jar:1.0.0.final] @ io.undertow.server.connectors.executeroothandler(connectors.java:168) [undertow-core-1.0.0.final.jar:1.0.0.final] @ io.undertow.server.httpserverexchange$1.run(httpserverexchange.java:687) [undertow-core-1.0.0.final.jar:1.0.0.final] @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1145) [rt.jar:1.7.0_45] @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:615) [rt.jar:1.7.0_45] @ java.lang.thread.run(thread.java:744) [rt.jar:1.7.0_45] caused by: javax.el.propertynotfoundexception: class 'at.co.xss.type2' not have property 'type1onlymethod'. @ javax.el.beanelresolver.getbeanproperty(beanelresolver.java:730) [javax.el-3.0.0.jar:3.0.0] @ javax.el.beanelresolver.getvalue(beanelresolver.java:351) [javax.el-3.0.0.jar:3.0.0] @ com.sun.faces.el.demuxcompositeelresolver._getvalue(demuxcompositeelresolver.java:176) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.faces.el.demuxcompositeelresolver.getvalue(demuxcompositeelresolver.java:203) [jsf-impl-2.2.5-jbossorg-3.jar:] @ com.sun.el.parser.astvalue.getvalue(astvalue.java:140) [javax.el-3.0.0.jar:3.0.0] @ com.sun.el.parser.astvalue.getvalue(astvalue.java:204) [javax.el-3.0.0.jar:3.0.0] @ com.sun.el.valueexpressionimpl.getvalue(valueexpressionimpl.java:226) [javax.el-3.0.0.jar:3.0.0] @ org.jboss.weld.el.weldvalueexpression.getvalue(weldvalueexpression.java:50) [weld-core-impl-2.1.2.final.jar:2014-01-09 09:23] @ org.jboss.weld.el.weldvalueexpression.getvalue(weldvalueexpression.java:50) [weld-core-impl-2.1.2.final.jar:2014-01-09 09:23] @ com.sun.faces.facelets.el.tagvalueexpression.getvalue(tagvalueexpression.java:109) [jsf-impl-2.2.5-jbossorg-3.jar:] ... 66 more
it seems in render-response phase nested ui:repeat
"executed" deleted type2
object.
if remove second (nested) ui:repeat
, add plain h:outputtext
access property available in type1
, works again without exception when add or remove elements:
<h:form id="dummyform"> <ui:repeat value="#{dummybean.objects}" var="_obj" > <!-- ... --> <h:panelgroup rendered="#{_obj.type eq '1'}"> <h:outputtext value="#{_obj.type1onlymethod.size()}" /> </h:panelgroup> <!-- ... --> </h:form>
does have idea on topic?
(running on jee7 application server (wildfly 8.0.0.final))
this caused bug in state management of mojarra's <ui:repeat>
fixed per issue 3215 reported fellow arjan tijms. faced problem when iterating on different block
instances @ zeef.com (linkblock
, imageblock
, textblock
, feedblock
). fix available in mojarra 2.2.7 , jsf 2.0/2.1 backported mojarra 2.1.29 per issue 3221. upgrading @ least version (or latest available per mojarra homepage) should it.
otherwise, best bet replace <ui:repeat>
<c:foreach>
.
Comments
Post a Comment