【发布时间】: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