2014-03-24 4 views
3

backing-bean에서 공통 인터페이스를 공유하는 여러 하위 클래스의 객체 콜렉션이 있습니다. 보기 내부에서 ui:repeat이 컬렉션을 반복합니다. 이 루프 내에서 인터페이스의 구체적인 구현에 따라 다른 속성을 렌더링해야합니다. javax.el.PropertyNotFoundException 다른 서브 클래스의 조건부 렌더링 된 속성을 가진 ui : repeat를 제출할 때

난 다음 백킹 빈에 문제를 감소 :

@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. 
} 

및 방법과 add1add2로 추가 된 다음 Type 구현. 그들은 몇 가지 일반적인 특성을 가지고 있지만, 그들은 또한 다른 사람, 등 아래의 예에서 getType1OnlyMethod() 등이 있습니다 :보기에서

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"; } 

    // ... 
} 

내가 DummyBean에 저장되어있는 모든 개체를 반복하고 표시 할 자신 내용.

<h:form id="dummyForm"> 
    <ui:repeat value="#{dummyBean.objects}" var="_obj" > 
    <h:outputText value="Type of the Object is #{_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> 

페이지에서 h:commandLink의 사용 I 추가 및 제거 할 수 있습니다 : 객체의 구체적인 유형에 따라, 단지 클래스 Type1에서 구현되는 방법은 조건부 렌더링을위한 rendered -attribute를 사용하여 호출 할 수 있습니다 Type1 개체가 있습니다. Type2 개체를 추가하면 예상대로 렌더링됩니다.

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}": The class 'at.co.xss.Type2' does not have the property 'type1OnlyMethod'. 
     at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:111) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.facelets.component.UIRepeat.getValue(UIRepeat.java:279) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.facelets.component.UIRepeat.getDataModel(UIRepeat.java:255) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.facelets.component.UIRepeat.setIndex(UIRepeat.java:523) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.facelets.component.UIRepeat.doVisitChildren(UIRepeat.java:790) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.facelets.component.UIRepeat.visitTree(UIRepeat.java:748) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at com.sun.faces.facelets.component.UIRepeat.visitTree(UIRepeat.java:754) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.component.UIForm.visitTree(UIForm.java:371) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at com.sun.faces.application.view.FaceletPartialStateManagementStrategy.saveView(FaceletPartialStateManagementStrategy.java:472) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.application.StateManagerImpl.saveView(StateManagerImpl.java:89) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at javax.faces.application.StateManager.getViewState(StateManager.java:593) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at com.sun.faces.context.PartialViewContextImpl.renderState(PartialViewContextImpl.java:486) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:328) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at javax.faces.context.PartialViewContextWrapper.processPartial(PartialViewContextWrapper.java:219) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:57) [primefaces-4.0.jar:4.0] 
     at org.richfaces.context.ExtendedPartialViewContextImpl.processPartial(ExtendedPartialViewContextImpl.java:218) [richfaces-core-impl-4.3.5.Final.jar:4.3.5.Final] 
     at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:435) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:337) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) [jboss-jsf-api_2.2_spec-2.2.5.jar:2.2.5] 
     at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) [shiro-web-1.2.2.jar:1.2.2] 
     at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) [shiro-web-1.2.2.jar:1.2.2] 
     at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) [shiro-core-1.2.2.jar:1.2.2] 
     at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) [shiro-core-1.2.2.jar:1.2.2] 
     at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383) [shiro-core-1.2.2.jar:1.2.2] 
     at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) [shiro-web-1.2.2.jar:1.2.2] 
     at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) [shiro-web-1.2.2.jar:1.2.2] 
     at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:56) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) [undertow-servlet-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687) [undertow-core-1.0.0.Final.jar:1.0.0.Final] 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [rt.jar:1.7.0_45] 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [rt.jar:1.7.0_45] 
     at java.lang.Thread.run(Thread.java:744) [rt.jar:1.7.0_45] 
Caused by: javax.el.PropertyNotFoundException: The class 'at.co.xss.Type2' does not have the property 'type1OnlyMethod'. 
     at javax.el.BeanELResolver.getBeanProperty(BeanELResolver.java:730) [javax.el-3.0.0.jar:3.0.0] 
     at javax.el.BeanELResolver.getValue(BeanELResolver.java:351) [javax.el-3.0.0.jar:3.0.0] 
     at com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     at com.sun.el.parser.AstValue.getValue(AstValue.java:140) [javax.el-3.0.0.jar:3.0.0] 
     at com.sun.el.parser.AstValue.getValue(AstValue.java:204) [javax.el-3.0.0.jar:3.0.0] 
     at com.sun.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:226) [javax.el-3.0.0.jar:3.0.0] 
     at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] 
     at org.jboss.weld.el.WeldValueExpression.getValue(WeldValueExpression.java:50) [weld-core-impl-2.1.2.Final.jar:2014-01-09 09:23] 
     at com.sun.faces.facelets.el.TagValueExpression.getValue(TagValueExpression.java:109) [jsf-impl-2.2.5-jbossorg-3.jar:] 
     ... 66 more 

그것은 render-에 보인다 : 나는 Type2 개체 중 하나를 제거하려고 할 때, 나는 렌더링 응답 단계 (기타리스트의 요소 여부가 그럼에도 불구 경우)에서 예외가 얻을 응답 단계 중첩 된 ui:repeat은 현재 삭제 된 Type2 개체에 대해 "실행"됩니다.

나는 (중첩) 두 번째를 제거 내가 요소를 추가하거나 제거 할 때 ui:repeatType1에서만 사용할 수있는 속성에 대한 액세스를 일부 일반 h:outputText을 추가, 모든 예외없이 다시 작동하는 경우 :

<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> 

사람을합니까를 이 주제에 대한 아이디어가 있으십니까? (JEE7 응용 프로그램 서버 (제이보스 8.0.0.Final)에서 실행)

답변

3

이것은 인 Mojarra의 <ui:repeat> 동료 Arjan Tijms에 의해보고 된 같은 issue 3215 당 고정 된 상태 관리 버그로 인해 발생합니다. 또한 서로 다른 Block 인스턴스를 반복 할 때 zeef.com (LinkBlock, ImageBlock, TextBlockFeedBlock)에이 문제가 발생했습니다. 수정본은 Mojarra 2.2.7에서 사용할 수 있으며 issue 3221에 따라 Mojarra 2.1.29으로 백 포트 된 JSF 2.0/2.1에서 사용할 수 있습니다. 그래서 적어도 그 버전으로 업그레이드하거나 Mojarra homepage에 따라 사용 가능한 최신 버전으로 업그레이드해야합니다.

그렇지 않은 경우 가장 좋은 방법은 <ui:repeat><c:forEach>으로 대체하는 것입니다.

1

필자의 경우 Mojarra의 버전을 업그레이드하고 c : forEach (UI가 선택적으로 렌더링 된 구성 요소와 함께 사용될 때 많은 부작용이 발생 함)를 피할 수있는 옵션이 없었습니다. ap : dataList로 반복했습니다. 일했다. 글 머리 기호를 숨기려면 CSS 스타일링을해야하지만 가격이 합리적이라고 생각합니다. 나는 그것이 누군가를 돕는다는 것을 희망한다;)