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>
你用update =「@ all」來試試嗎? – OTM
感謝OTM,試着將它改爲@all,不幸的是它沒有幫助。在這種情況下,對話框甚至沒有彈出。 – Pecc