Primefaces p:ajaxStatus onerror未调用

时间:2011-08-04 17:43:51

标签: java jsf glassfish primefaces

我正在尝试使用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只是没有被调用。我是否误解了这应该如何运作?

1 个答案:

答案 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>