2017-04-25 40 views
2

Primefaces 6.1 ajaxExceptionHandler在liferay 7 portlet中無法按預期工作。 基於Primefaces用戶指南,我試圖實現簡單的異常處理。當按下commandButton時,後臺bean會拋出一個NullPointerException,它應該顯示在對話窗口中。問題是,彈出對話框時,不顯示異常信息。看起來返回的Ajax響應本身包含異常信息(如下所示),但對話框組件沒有相應更新。Primefaces ajaxExceptionHandler在liferay中不工作7

test.xhtml(片斷)

<h:body> 

    <h:form> 
     <h3 style="margin-top:0">AJAX 1410</h3> 
     <p:commandButton actionListener="#{policyAdminBean.throwNpe}" 
         ajax="true" 
         value="Throw NullPointerException!" /> 

     <p:ajaxExceptionHandler type="javax.faces.application.ViewExpiredException" 
           update=":exceptionDialog" 
           onexception="PF('exceptionDialogVar').show();" /> 

     <p:ajaxExceptionHandler type="java.lang.NullPointerException" 
           update=":exceptionDialog" 
           onexception="PF('exceptionDialogVar').show();" /> 
    </h:form> 

    <p:dialog id="exceptionDialog" header="Exception '#{pfExceptionHandler.type}' occured!" widgetVar="exceptionDialogVar" 
       height="500px"> 
     Message: #{pfExceptionHandler.message} <br/> 
     StackTrace: <h:outputText value="#{pfExceptionHandler.formattedStackTrace}" escape="false" /> <br /> 

     <p:button onclick="document.location.href = document.location.href;" 
        value="Reload!" 
        rendered="#{pfExceptionHandler.type == 'javax.faces.application.ViewExpiredException'}" /> 
    </p:dialog> 


</h:body> 

TestBean.java

@Named 
@ViewScoped 
public class TestBean implements Serializable { 
    private static final long serialVersionUID = -4856350663999482370L; 

    public void throwNpe(){ 
     throw new NullPointerException("test exception"); 
    } 
} 

faces-config.xml中(片斷)

<application> 
     <message-bundle>Language</message-bundle> 
     <locale-config> 
      <default-locale>hu</default-locale> 
     </locale-config> 
     <el-resolver> 
      org.primefaces.application.exceptionhandler.PrimeExceptionHandlerELResolver 
     </el-resolver> 
    </application> 
    <lifecycle> 
     <phase-listener>com.liferay.faces.util.lifecycle.DebugPhaseListener</phase-listener> 
    </lifecycle> 
    <factory> 
     <exception-handler-factory> 
      org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory 
     </exception-handler-factory> 
    </factory> 

Ajax響應(片段)

<partial-response id="_policyadmin_WAR_wfsadminportlets_"> 
    <update id="_policyadmin_WAR_wfsadminportlets_:exceptionDialog"><![CDATA[ 
     <div id="_policyadmin_WAR_wfsadminportlets_:exceptionDialog" 
      class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-shadow ui-hidden-container"> 
      <div class="ui-dialog-titlebar ui-widget-header ui-helper-clearfix ui-corner-top"><span 
        id="_policyadmin_WAR_wfsadminportlets_:exceptionDialog_title" class="ui-dialog-title">Exception 'java.lang.NullPointerException' occured!</span><a 
        href="#" class="ui-dialog-titlebar-icon ui-dialog-titlebar-close ui-corner-all" 
        aria-label="Close"><span class="ui-icon ui-icon-closethick"></span></a></div> 
      <div class="ui-dialog-content ui-widget-content"> 
       Message: test exception <br/> 
       StackTrace: java.lang.NullPointerException: test exception<br/> at 

       [removed for brevity...] 

       java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)<br/> at 
       java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)<br/> at 
       java.lang.Thread.run(Thread.java:745)<br/> <br/></div> 
     </div> 
     <script id="_policyadmin_WAR_wfsadminportlets_:exceptionDialog_s" type="text/javascript">$(function() { 
      PrimeFaces.cw("Dialog", "exceptionDialogVar", { 
       id: "_policyadmin_WAR_wfsadminportlets_:exceptionDialog", 
       height: "500px" 
      }); 
     });</script> 
     ]]> 
    </update> 
    <eval><![CDATA[var 
     hf=function(type,message,timestampp){PF('exceptionDialogVar').show();};hf.call(this,"java.lang.NullPointerException","test 
     exception","2017-04-25 14:54:55");]]> 
    </eval> 
</partial-response> 
+0

你用update =「@ all」來試試嗎? – OTM

+0

感謝OTM,試着將它改爲@all,不幸的是它沒有幫助。在這種情況下,對話框甚至沒有彈出。 – Pecc

回答

1

好問題!

PrimeFaces AJAX異常處理程序的這種使用模式在6.0以前的PrimeFaces中使用。因此,如果你恢復說PrimeFaces 5.3,你會看到它在Liferay 7上工作。打破PrimeFaces的提交是e22e40a,這是一個複雜的提交,通過改變構建PrimeFaces部分響應的方式,不知不覺地影響portlet。

A pull request已發送至PrimeFaces integrators來解決此問題。 https://github.com/primefaces/primefaces/pull/2333

一旦這個拉取請求被合併,你可以build PrimeFaces from the latest source,你會看到這是固定的。

詳情: 具體地,提交e22e40a改變PrimePartialResponseWriter.startDocument()方法,eliminating its call to encodeCallbackParams()這反過來,被調用startChangesIfNecessary() method in mojarra。由於這些呼叫被消除,所以在部分響應中沒有引入「變化」因素。沒有任何更改,對話框的DOM中不會發生更新。這是一個工作堆棧,在e22e40a提交之前顯示calls down into startChangesIfNecessary

+1

感謝您的回答,弗農,問題解決了。 :) – Pecc