2011-12-09 46 views
0

我有包含自己的DTO(它是嵌套的)。我可以遞歸嵌套一個複合組件嗎?

public class MyDTO { 

    private SomeData someData; 
    private MyDTO nested; 

    // getters and setters 
} 

我創建了複合組件,它是遞歸調用自己的。我這樣稱呼它:

<screen:my-dto-screen dto="#{myDTOBean.myDto}" /> 

的定義是:

<composite:interface> 
    <composite:attribute name="dto"/> 
</composite:interface> 
     -- display "someData" here -- 
    <p:panel rendered="#{cc.attrs.dto.nested != null}" /> -- this acts as recursion bottom -- 
     <screen:my-dto-screen dto="#{cc.attrs.dto.nested}" />    
    </p:panel> 
<composite:implementation> 

真正的代碼是不是這樣簡單,但我寫了這個,爲了給你一個簡單的想法的問題是什麼。一切似乎都很好,但我看到一些奇怪的例外。

javax.servlet.ServletException 
javax.faces.webapp.FacesServlet.service(FacesServlet.java:422) 
org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368) 
cayetano.games.common.web.security.OperatorPermissionsFilter.doFilter(OperatorPermissionsFilter.java:74) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109) 
org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
cayetano.games.common.web.security.WebUsernamePasswordAuthenticationFilter.actualDoFilter(WebUsernamePasswordAuthenticationFilter.java:65) 
cayetano.games.common.web.security.WebUsernamePasswordAuthenticationFilter.doFilter(WebUsernamePasswordAuthenticationFilter.java:43) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) 
org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) 
org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) 
org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 

root cause 

java.lang.StackOverflowError 
java.util.regex.Pattern$Curly.match(Pattern.java:3754) 
java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3383) 
java.util.regex.Pattern$Slice.match(Pattern.java:3499) 
java.util.regex.Pattern$GroupTail.match(Pattern.java:4244) 
java.util.regex.Pattern$BranchConn.match(Pattern.java:4095) 
java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3383) 
java.util.regex.Pattern$Branch.match(Pattern.java:4131) 
java.util.regex.Pattern$GroupHead.match(Pattern.java:4185) 
java.util.regex.Pattern$CharProperty.match(Pattern.java:3362) 
java.util.regex.Pattern$Start.match(Pattern.java:3072) 
java.util.regex.Matcher.search(Matcher.java:1116) 
java.util.regex.Matcher.find(Matcher.java:552) 
com.sun.faces.el.ELUtils.isCompositeComponentExpr(ELUtils.java:195) 
com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:388) 
com.sun.faces.facelets.tag.TagAttributeImpl.getValueExpression(TagAttributeImpl.java:351) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler$CompositeComponentRule$CompositeExpressionMetadata.applyMetadata(CompositeComponentTagHandler.java:588) 
com.sun.faces.facelets.tag.MetadataImpl.applyMetadata(MetadataImpl.java:81) 
javax.faces.view.facelets.MetaTagHandler.setAttributes(MetaTagHandler.java:129) 
javax.faces.view.facelets.DelegatingMetaTagHandler.setAttributes(DelegatingMetaTagHandler.java:102) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.setAttributes(CompositeComponentTagHandler.java:226) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:183) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
com.sun.faces.facelets.tag.composite.ImplementationHandler.apply(ImplementationHandler.java:81) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86) 
com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyCompositeComponent(CompositeComponentTagHandler.java:349) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:190) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
com.sun.faces.facelets.tag.composite.ImplementationHandler.apply(ImplementationHandler.java:81) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
com.sun.faces.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:93) 
com.sun.faces.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:86) 
com.sun.faces.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:152) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyCompositeComponent(CompositeComponentTagHandler.java:349) 
com.sun.faces.facelets.tag.jsf.CompositeComponentTagHandler.applyNextHandler(CompositeComponentTagHandler.java:190) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:98) 
javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:137) 
com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:188) 
javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:120) 
com.sun.faces.facelets.tag.composite.ImplementationHandler.apply(ImplementationHandler.java:81) 

回答

2

在視圖構建期間發生此異常。 rendered屬性是而不是在視圖構建時間期間進行了評估。它只在視圖渲染時間(以及在輸入和命令組件上應用請求值階段期間進行評估,但這是一個故事)。所以你的方法最終會在一個無限的遞歸循環中結束,最終會導致內存中的堆棧溢出。

基本上,您想要在視圖生成時間內評估條件。所以你需要一個標籤/屬性在視圖構建時運行。其中之一是JSTL <c:if>

​​

但是,如果#{cc.attrs.dto.nested}值由渲染時間屬性提供的,因此遞歸將無法正常工作,這並不工作。只顯示頂層組件。你正在尋找一種迭代方法。考慮查看現有的JSF樹組件,例如PrimeFaces的<p:tree>

+0

感謝您的幫助,但標籤 – user358448