【问题标题】:Primefaces p:ajaxStatus onerror not calledPrimefaces p:ajaxStatus onerror 未调用
【发布时间】:2011-08-04 17:43:51
【问题描述】:

我正在尝试在 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。我是否误解了这应该如何工作?

【问题讨论】:

  • 你如何模拟错误?您是明确抛出ViewExpiredException 还是只认为应该在某个地方调用它。我问这个是因为我的想法是,如果您在该命名错误之前遇到其他错误怎么办,而 ViewExpiredException 是因为未调用。
  • 在这种情况下,我从 facesContext.getExternalContext().getSession() 获取会话,然后对其调用 invalidate()。调用它的方法是从不同的浏览器窗口调用的。我也尝试过重启服务器和设置非常短的会话超时。
  • 我的“答案”是一个问题,您是否 100% 确定所说的 invalidate() 方法会准确地抛出所说的 ViewExpiredException 而没有别的?我的假设是它可能会抛出其他东西,这就是你看不到它的原因。这是一个想到的假设,而不是经过科学证明的答案。
  • 无效不会抛出任何东西。会话失效后的下一个 ajax 请求会创建带有错误的部分响应。 Primefaces 似乎没有将其识别为错误。

标签: java jsf glassfish primefaces


【解决方案1】:

不会调用 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>

【讨论】:

  • 我最终做了同样的事情,但在后面使用异常处理程序来发送重定向,而不是在客户端捕获它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 2012-07-24
  • 1970-01-01
相关资源
最近更新 更多