1

我正在使用 Mojarra 2.2.8 和 Primefaces 5.2。我需要在 ajax 请求中包含不同的 facelets,所以我在托管 bean 中使用此代码:

FaceletContext faceletContext = (FaceletContext) context.getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
if (type.equals("default")) {
        faceletContext.includeFacelet(this, "/defaultDlg.xhtml");
}

defaultDlg.xhtml我有 Primefaces 动态 tabView:

<p:tabView id="contentTabView" onTabShow="PF('contentDlg').initPosition();" dynamic="true">
    <p:ajax event="tabChange" listener="#{folderView.onTabChange}"/>
    <p:tab title="#{msg['title.documentCard']}">
        <p:panel>

            <!--  some widgets here... -->

        </p:panel>
    </p:tab>
    <p:tab title="#{msg['title.performance']}">
        <!--  DataTable with subTable ... -->
        <p:dataTable  value="#{folderView.performance}" 
                                id="historyTable" widgetVar="historyTable" var="wf">
            <p:columnGroup type="header">
                <p:row>
                    <p:column headerText="#{msg['audit.performance.sendbydesc']}" />
                    <p:column  headerText="#{msg['audit.performance.performerdesc']}" />
                </p:row>
            </p:columnGroup>

            <p:subTable var="task" value="#{wf[5]}">
                <f:facet name="header">
                    <h:outputText value="#{wf[2]}" />
                </f:facet>
                <p:column>
                    <h:outputText value="#{task[2]}" />
                </p:column>
                <p:column>
                    <h:outputText value="#{task[4]}" />
                </p:column>
            </p:subTable>
        </p:dataTable>
    </p:tab>
    <!--  more tabs ... -->

在相关问题上查看了这个答案,用户说“使用 FaceletContext 是错误的方法,因为后来它会导致重复的 id 和状态管理问题”,没有任何解释。在我的示例中,此方法正确包含来自defaultDlg.xhtml的UIComponents以查看根目录并将它们呈现在页面上。

但是,当我单击带有 subTable 的第二个选项卡或发出任何 ajax 请求时,我收到此错误:

严重:java.lang.NumberFormatException:尝试从 clientId 'ntikDoc:contentTabView:historyTable:j_id492561291_69346d22:j_id492561291_69346d58'中提取 rowIndex 对于输入字符串:“j_id492561291_69346d22”在 javax.faces.component.java1021)atComponent(UIData.invokeOnComponent) javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503)在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) ) 在 org.primefaces.component。api.UITabPanel.invokeOnComponent(UITabPanel.java:798) 在 javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces .component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax。 faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax .faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces。component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces.component.UIComponent.invokeOnComponent(UIComponent.java:1503) 在 javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) 在 javax.faces .component.UIComponent.invokeOnComponent(UIComponent.java:1503) at javax.faces.component.UIComponentBase.invokeOnComponent(UIComponentBase.java:713) at com.sun.faces.application.view.FaceletViewHandlingStrategy.locateComponentByClientId(FaceletViewHandlingStrategy.java:2063 ) 在 com.sun.faces.application.view.FaceletViewHandlingStrategy.reapplyDynamicActions(FaceletViewHandlingStrategy.java:2114) 在 com.sun.faces.com.sun.faces.application.view.FaceletViewHandlingStrategy.reapplyDynamicAdd(FaceletViewHandlingStrategy.java:2127)。应用程序.view。FaceletViewHandlingStrategy.buildView(FaceletViewHandlingStrategy.java:961) at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:99) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) at com .sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 在 javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 在 sun.reflect.GeneratedMethodAccessor167.invoke(Unknown Source) 在 sun.reflect .DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:323) at org .apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:321) 在 java.security.AccessController.doPrivileged(Native Method) 在 javax.security.auth。Subject.doAsPrivilege(Subject.java:536) at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:356) at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:212) at org .apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1543) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) 在 org.apache.catalina.core.ApplicationFilterChain.access$000( ApplicationFilterChain.java:88) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:200) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:197) at java.security .AccessController.doPrivileged(Native Method) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:196) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) 在 org.apache.catalina.core.ApplicationFilterChain 的 org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:100) .access$000(ApplicationFilterChain.java:88) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:200) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:197)在 java.security.AccessController.doPrivileged(Native Method) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:196) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) 在 org.apache.catalina.core.StandardHostValve 的 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) .invoke(StandardHostValve.java:161) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) 在 com。 sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) 在 com.sun。 com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) 上 com.sun.grizzly.http.ProcessorTask 上的 grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)。在 com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) 在 com.sun.grizzly 的 com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) 的进程(ProcessorTask.java:1056) .DefaultProtocolChain.execute(DefaultProtocolChain.java:104) 在 com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) 在 com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) 在 com. sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com .sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) 在 com.sun.grizzly.util。AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) 在 java.lang.Thread.run(Thread.java:745)

我认为在 ajax 请求期间状态保存可能存在问题,因为如果我从第二个选项卡中删除 subTable,我会在每个 ajax 请求时收到以下警告:

警告:无法使用 clientId 'ntikDoc:j_id69584408_969820d' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:j_id69584408_969820d_1' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 保存动态操作ntikDoc:idtFrom:j_id69584408_969829e' 因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:idtFrom:j_id69584408_96982b4' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:j_id69584408_96983ee' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:idtTo:j_id69584408_9698056' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:idtTo:j_id69584408_969806c' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:idtTo:j_id69584408_969800a'​​ 保存动态操作,因为找不到 UIComponent 警告:无法保存动态操作clientId 'ntikDoc:contentTabView:j_id492561291_69346015' 因为 UIComponent 找不到contentTable:j_id492561291_69346b92' 因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:contentTabView:contentTable: 保存动态操作:j_id492561291_69346bfc',因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:contentTabView:perTable:j_id492561291_69346cc4' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:contentTabView:perTable:j_id492561291_69346c 保存动态操作因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:contentTabView:perTable:j_id492561291_69346c10' 保存动态操作,因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:contentTabView:historyTable:j_id492561291_69346d22:j_id492561291_69346c10'保存动态操作因为找不到 UIComponent 警告:无法使用 clientId 'ntikDoc:contentTabView:historyDocTable 保存动态操作:j_id492561291_69346ef9' 因为找不到 UIComponent

那么如何faceletContext.includeFacelet正确使用呢?

4

0 回答 0