2017-04-25 57 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