2015-01-12 27 views
0

這是XHTML網頁上我的treetable中定義:NPE在TreeTableRenderer.encodeEnd

<p:treeTable var="r" value="#{mybean.tree}"> 

我可以在catalina.out的文件中看到,每天都有這種情況發生過幾次:

12-Jan-2015 10:13:00.119 SEVERE [ajp-apr-8009-exec-211] com.sun.faces.application.view.FaceletViewHandlingStrategy.handleRenderException Error Rendering View[/my_page.xhtml] 
    java.lang.NullPointerException 
     at org.primefaces.component.treetable.TreeTableRenderer.encodeEnd(TreeTableRenderer.java:127) 
     at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) 
     at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863) 
     at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:582) 
     at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) 
     at org.primefaces.component.api.UITree.visitTree(UITree.java:648) 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
     at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
     at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403) 
     at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:322) 
     at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60) 
     at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004) 
     at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856) 
     at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:430) 
     at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) 
     at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
     at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
     at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
     at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:831) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
     at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2344) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 

    12-Jan-2015 10:13:00.120 SEVERE [ajp-apr-8009-exec-211] com.sun.faces.context.AjaxExceptionHandlerImpl.handlePartialResponseError java.lang.NullPointerException 
     at org.primefaces.component.treetable.TreeTableRenderer.encodeEnd(TreeTableRenderer.java:127) 
     at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919) 
     at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1863) 
     at com.sun.faces.context.PartialViewContextImpl$PhaseAwareVisitCallback.visit(PartialViewContextImpl.java:582) 
     at com.sun.faces.component.visit.PartialVisitContext.invokeVisitCallback(PartialVisitContext.java:183) 
     at org.primefaces.component.api.UITree.visitTree(UITree.java:648) 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
     at javax.faces.component.UIForm.visitTree(UIForm.java:371) 
     at javax.faces.component.UIComponent.visitTree(UIComponent.java:1700) 
     at com.sun.faces.context.PartialViewContextImpl.processComponents(PartialViewContextImpl.java:403) 
     at com.sun.faces.context.PartialViewContextImpl.processPartial(PartialViewContextImpl.java:322) 
     at org.primefaces.context.PrimePartialViewContext.processPartial(PrimePartialViewContext.java:60) 
     at javax.faces.component.UIViewRoot.encodeChildren(UIViewRoot.java:1004) 
     at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1856) 
     at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:430) 
     at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:133) 
     at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120) 
     at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
     at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219) 
     at javax.faces.webapp.FacesServlet.service(FacesServlet.java:647) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
     at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537) 
     at org.apache.coyote.ajp.AbstractAjpProcessor.process(AbstractAjpProcessor.java:831) 
     at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658) 
     at org.apache.tomcat.util.net.AprEndpoint$SocketWithOptionsProcessor.run(AprEndpoint.java:2344) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
     at java.lang.Thread.run(Thread.java:745) 

我的天堂沒有任何用戶的投訴,我不知道用戶在這種情況下做了什麼。我假設她只是打開頁面,但由於handlePartialResponseError我想它可能也在擴大/崩潰。

錯誤是否表明我的對象在樹的一個條目中是null?在我的代碼中,我確定沒有添加空值,所以不應該如此。

mybean@SessionScoped@ManagedBean(以前是@ViewScoped,但現在樹爲每個用戶緩存)。

我的設置是:

  • 的Tomcat 8.0.15
  • 鑽嘴魚科2.2.8
  • Primefaces 5.1
  • RHEL 7.0
+1

如果模型不兼容地同時發生更改,可能會發生。 '#{mybean.tree}'放在什麼範圍內?代碼是否保證該實例不被另一個請求共享? – BalusC

+0

謝謝,增加了問題的範圍。基於這些信息,我需要保證(如何?)「該實例不被另一個請求共享」? –

+1

會話範圍的bean由多個請求/視圖共享。如果模型是可變的,那麼當多個請求/視圖同時執行時,這確實會導致像這樣的併發(threadsafety)問題。如果Web應用程序「速度慢」且最終用戶非常熟悉在多個瀏覽器選項卡/窗口中工作,則風險更高。嘗試將bean放回視圖範圍,並觀察問題是否存在。 – BalusC

回答

0

由於@BalusC在他的評論中這樣寫道例外在構建UI樹時更改後端樹時發生。

p:treeTable建立它時,實際上多次調用getTree()方法,至少每個類別一次。如果其中一個電話收到一個不等於其他電話號碼的TreeNode對象,則會拋出此異常。

在我的代碼中,我確信getTree()將始終返回相同的TreeNode對象,如果它最後由小於10ms前的同一用戶調用。這解決了它。

更好的解決辦法是在PrimeFaces的修復,這將使p:treeTable要求TreeNode對象一次。

1

我不認爲這是一個很好的解決方案。代碼應該看起來更像是這樣的:

public TreeNode getRoot() { 
    checkSession(); 
    if (root == null) { 
     root = new DefaultTreeNode(data, null); 
    } 
    return root; 
} 

爲了確保它是相同的對象(假設bean的權利範圍)

邁克爾

+0

謝謝。什麼是'checkSession();'? –

0

呼叫以下JS功能<p:ajax event="select" onstart="func()" />onstart

function func(){ 
    var originalVal = $('<YOUR_TREETABLE_ID>_selection').val(); 
    var arr = originalVal.split(','); 
    $('<YOUR_TREETABLE_ID>_selection').val(arr[arr.length-1]); 
}