我正在尝试使用glassfish 3.1上的primefaces 2.2.1在ajax调用上处理ViewExpiredException异常。我有一个像这样的ajaxStatus:
<p:ajaxStatus id="ajaxStatus"
onstart="startAjaxDisplay()"
onerror="ajaxErrorHandler()"
oncomplete="endAjaxDisplay()"/>
按预期调用onstart和oncomplete。我知道ajaxErrorHandler()是有效的,因为我把它放在oncomplete上而是被调用了。现在正在做的就是弹出一个警报()。我设置了我的测试,服务器的响应如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<partial-response>
<error>
<error-name>class javax.faces.application.ViewExpiredException</error-name>
<error-message><![CDATA[viewId:/index.xhtml - View /index.xhtml could not be restored.]]></error-message>
</error>
<changes>
<extension primefacesCallbackParam="validationFailed">{"validationFailed":false}</extension>
</changes>
</partial-response>
这一切都如预期的那样,除了onerror只是没有被调用。我是否误解了这应该如何运作?
答案 0 :(得分:4)
将不会调用onerror处理程序,因为 ViewExpiredException 不是AJAX错误,而是在构建已过期的视图(会话已过期)期间的JSF。 PrimeFaces ajax组件不会将此情况视为错误。
在我的解决方案(JSF2 + PrimeFaces3)中,我调查来自服务器的ajax响应并搜索JSF错误消息。请参阅下面最简单的示例:
<h:head>
<title>Facelet Title</title>
<script language="javasript" type="text/javascript">
function handleAjaxRequest(xhr, status, args){
var xmlDoc = xhr.responseXML;
errorNodes = xmlDoc.getElementsByTagName('error-name');
if (errorNodes.length == 0) return;
errorName = errorNodes[0].childNodes[0].nodeValue;
switch (errorName) {
case 'class javax.faces.application.ViewExpiredException':
alert ('Session expired, redirecting to login page!');
window.location.href = 'login.xhtml';
break;
}
}
</script>
</h:head>
<h:body>
<h:form id="frmText">
Enter the value: <p:inputText value="#{bean.text}" />
<p:commandButton value="Enter" update="frmText"
oncomplete="handleAjaxRequest(xhr, status, args);"/>
<p:separator />
The entered text is: <h:outputText value="#{bean.text}" style="font-weight: 900"/>
</h:form>
</h:body>