ViewExpiredException - 为什么不同的行为?

时间:2012-11-19 16:08:24

标签: jsf-2 viewexpiredexception

我有一个JSF 2应用程序,并在web.xml中配置了以下内容:

<error-page>
        <exception-type>javax.faces.application.ViewExpiredException</exception-type>
        <location>/error.html</location>
</error-page>

出于测试目的,我在使用@SessionScoped注释的init方法中的@PostConstruct类中有以下代码,以便让会话快速过期:

ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
HttpSession session = (HttpSession) ec.getSession(false);
session.setMaxInactiveInterval(5);

现在,当我有一个h:commandButton outcome = "somepage.jsf"时,5s之后的点击会重定向到错误页面。

当我使用action属性调用某个bean操作或将页面名称放在同一个按钮上时,我在服务器的日志中看到ViewExpiredException,但没有重定向。< / p>

为什么会这样?以及如何在会话到期后无论哪个行动发生,一般都会重定向到另一个页面?

1 个答案:

答案 0 :(得分:1)

行为不同,因为已发送异步(ajax)请求。 Ajax请求需要特殊的XML响应。有关ajax请求的例外情况需要由JavaScript中的jsf.ajax.addOnError处理程序或自定义ExceptionHandler处理。

默认情况下,客户端没有任何形式的有用反馈。只有在项目阶段设置为Development的Mojarra中,您才会看到带有异常消息的简单JavaScript警报消息。但就是这样。 Production阶段没有单一形式的反馈。

使用自定义ExceptionHandler,您将能够模拟与同步请求中完全相同的反馈形式。您可以解析web.xml以找到正确的错误页面位置,在其周围创建一个新的UIViewRoot并强制JSF将ajax渲染设置为@all。由于这毕竟是相当多的工作,JSF实用程序库OmniFacesFullAjaxExceptionHandler的风格框中提供了这样的异常处理程序。您可以找到展示页面here