Primefaces嵌套数据表在对数据表进行排序后抛出空指针异常并提交并呈现到同一页面

时间:2017-02-01 09:42:55

标签: jsf primefaces datatable

我有像列表对象列表这样的记录,需要像嵌套数据表一样显示。因此决定在datagrid / datalist / uirepeat / p中使用datatable:对数据表进行重复和排序。这是下面的代码。它能够完美地显示,但在对生成的多个数据表进行排序并点击提交后,在渲染到同一页面时,应用程序将NullpointerException放入primefaces数据表findcolumngroup。仅当我们对生成的多个数据表进行排序时才会发生这种情况。如果仅对生成的1个数据表进行排序并点击提交按钮,则没有问题。此外,如果没有应用排序,那么它正常工作,没有任何异常。 bean范围是viewscope。我还设置了rowStatePreserved = true,添加此排序后无法正常工作。

<p:dataGrid var="cardslist" value="#{bean.cardslist}">
  <h:panelGrid columns="1" border="0">
    <p:column>
      <p:dataTable value="#{cardslist.businesslist}"
        var="card">
        <p:column headerText="businessname" sortBy="#{card.business.name}">
            <h:outputText value="#{card.business.name}" />
        </p:column>
      </p:dataTable>
    </p:column>
  </h:panelGrid>
</p:dataGrid>

<p:commandButton value="submit" style="width:auto;"
                     action="#{bean.submit}"
                    update=":testform" />

抛出异常:

[1/02/17 7:45:28:801 CET] 0000009f FaceletViewDe E   Error Rendering View[/cbhCardsOverview.xhtml]
                                 java.lang.NullPointerException
    at org.primefaces.component.datatable.DataTable.findColumnInGroup(DataTable.java:909)
    at org.primefaces.component.datatable.DataTable.findColumn(DataTable.java:900)
    at org.primefaces.component.datatable.DataTable.getSortColumn(DataTable.java:1444)
    at org.primefaces.component.datatable.feature.SortFeature.singleSort(SortFeature.java:136)
    at org.primefaces.component.datatable.DataTableRenderer.preRender(DataTableRenderer.java:109)
    at org.primefaces.component.datatable.DataTableRenderer.encodeEnd(DataTableRenderer.java:83)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:579)
    at javax.faces.component.UIData.encodeEnd(UIData.java:869)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:89)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:72)
    at org.primefaces.component.column.ColumnRenderer.encodeEnd(ColumnRenderer.java:54)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:579)
    at org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:543)
    at org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.renderChildren(HtmlGridRendererBase.java:315)
    at org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.encodeEnd(HtmlGridRendererBase.java:150)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:579)
    at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:89)
    at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:72)
    at org.primefaces.component.datagrid.DataGridRenderer.encodeTable(DataGridRenderer.java:203)
    at org.primefaces.component.datagrid.DataGridRenderer.encodeContent(DataGridRenderer.java:130)
    at org.primefaces.component.datagrid.DataGridRenderer.encodeMarkup(DataGridRenderer.java:112)
    at org.primefaces.component.datagrid.DataGridRenderer.encodeEnd(DataGridRenderer.java:49)
    at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:579)
    at javax.faces.component.UIData.encodeEnd(UIData.java:869)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:626)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:622)
    at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.processRenderComponent(PartialViewContextImpl.java:576)
    at org.apache.myfaces.context.servlet.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:554)
    at org.apache.myfaces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:207)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:773)
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1051)
    at javax.faces.component.UIForm.visitTree(UIForm.java:246)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:793)
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1051)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:793)
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1051)
    at javax.faces.component.UIComponent.visitTree(UIComponent.java:793)
    at javax.faces.component.UIComponentBase.visitTree(UIComponentBase.java:1051)
    at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartialRendering(PartialViewContextImpl.java:443)
    at org.apache.myfaces.context.servlet.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:363)
    at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60)
    at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:390)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:617)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1364)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:263)
    at com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:163)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:59)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:85)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:240)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1230)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:779)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:478)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
    at colruyt.webutillib.filter.ResponseBufferFilter.doFilter(ResponseBufferFilter.java:35)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at colruyt.webutillib.session.SessionTimeoutFilter.doFilter(SessionTimeoutFilter.java:65)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at colruyt.webutillib.security.SecurityFilter.doFilter(SecurityFilter.java:132)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:960)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1064)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:914)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:453)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:515)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:306)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:84)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1702)

2 个答案:

答案 0 :(得分:2)

问题得到解决。

在分析异常之后,findcolumningroup()方法中存在空指针异常。看起来即使p:columngroup没有使用它也期望p:columngroup存在,因为datatable在datagrid中。所以我把p:columngroup放在标题和排序中,并从中分离出列。然后它盯着工作。

    <p:dataGrid id="datagrid123" var="parentsvo" value="#{helloMB.parentVOs}" columns="1" rowIndexVar="rownind">

 <f:facet name="header">
            Cars for Sale
        </f:facet>

        <p:dataTable id="DTABLETABLE" var="childvo" value="#            {parentsvo.childVOs}" rowIndexVar="rownindex" 
   >
         <p:columnGroup id="columng" type="header">
    <p:row>
      <p:column headerText="Name" sortBy="#{childvo.name}"/>
       </p:row>
     </p:columnGroup>

      <p:column  id="one" >
        <h:outputText value="#{childvo.name}" />
       </p:column>
      </p:dataTable>

答案 1 :(得分:-1)

您是否尝试在datagrid panelgrid和datatable上设置ID?