Странное поведение Дерево внутри ui:repeat или ice:panelseries

Итак, у меня в основном есть дерево внутри складного элемента, и я повторяю с помощью ui:repeat или ice:panelSeries, потому что они в значительной степени имеют одинаковую структуру.

<ui:repeat value="#{navigationBean.navigationPanels}" var="panel"  >
        <ice:panelCollapsible immediate="true" expanded="#{panel.expanded}" >
            <f:facet name="header">
                <ice:panelGroup>
                    <ice:outputText value="#{panel.title}" />
                </ice:panelGroup>
            </f:facet>
            <ice:panelGroup styleClass="treeContainer">
                <ice:tree id="tree" value="#{panel.treeModel}" var="item"
                    hideRootNode="true" hideNavigation="true" 
                    imageDir="#{facesContext.externalContext.requestContextPath}/xmlhttp/css/xp/css-images/">
                    <ice:treeNode>
                        <f:facet name="icon">
                            <ice:panelGroup style="display: inline">
                                <h:graphicImage
                                    value="#{userPreferences.imageDirectory}/#{item.userObject.icon}" />
                            </ice:panelGroup>
                        </f:facet>
                        <f:facet name="content">
                            <ice:panelGroup style="display: inline">
                                <ice:outputLink value="#{item.userObject.url}">
                                    <ice:outputText styleClass="treeNode" value="#{item.userObject.text}" />
                                </ice:outputLink>
                            </ice:panelGroup>
                        </f:facet>
                    </ice:treeNode>
                </ice:tree>
            </ice:panelGroup>
        </ice:panelCollapsible>
        </ui:repeat>

Проблема в том, что когда я разворачиваю или сворачиваю панель, я получаю ужасную ошибку, вот стек:

java.lang.NullPointerException
    at com.icesoft.faces.component.tree.Tree.visitRows(Tree.java:1447)
    at com.icesoft.faces.component.tree.Tree.visitTree(Tree.java:1402)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487)
    at com.sun.faces.facelets.component.UIRepeat.visitTree(UIRepeat.java:606)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487)
    at javax.faces.component.UIForm.visitTree(UIForm.java:331)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:1487)
    at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:258)
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:380)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Любая идея, почему это может вести себя так ??


person Necronet    schedule 10.03.2011    source источник


Ответы (2)


Согласно source, #{panel.treeModel} оценивается как null.

Попробуйте <ice:tree rendered="#{panel.treeModel != null} ... и посмотрите, что произойдет.

person Adam    schedule 10.03.2011
comment
я ничего не пробовал, а также с rendered=#{not empty panel.treeModel}, но все равно сталкивался с той же раздражающей ошибкой!! - person Necronet; 10.03.2011
comment
как я уже сказал, это произошло только с ui:series или ice:panelSeries, потому что я вручную, установив индекс массива списка navigationPanels, установил свои bean-компоненты, и он отлично работает!! - person Necronet; 10.03.2011

Возможно, проблема не возникает при рендеринге. Это могло произойти при построении дерева компонентов на стороне сервера. В таких случаях вы должны убедиться, что xml-тег <ice:tree../> вообще не анализируется.

Так что постарайтесь:

<c:if test="#{not empty panel.treeModel}"> <ice:tree ../> </c:if>

Это работает не во всех случаях. Так что пробуйте :-)

person Steff    schedule 12.03.2011