我设置了web.xml,所以任何
java.lang.Throwable(即任何未捕获的异常或错误)将转发到错误页面.然而,对于AJAXified组件,异常不会通过此机制路由到错误页面.
测试用例我有一个简单的CommandButton绑定到一个总是抛出RuntimeException的动作方法.似乎最好的做法是让action方法捕获异常并添加一个类型为error severity的FacesMessage.这是人们做的吗有没有办法配置JSF,以便如果AJAXified组件的备份bean方法抛出异常,可以显示错误页面?
您需要实现一个自定义的
ExceptionHandler
,在ajax请求中发生异常时基本上执行以下操作:
String errorPageLocation = "/WEB-INF/errorpages/500.xhtml"; context.setViewRoot(context.getApplication().getViewHandler().createView(context,errorPageLocation)); context.getPartialViewContext().setRenderAll(true); context.renderResponse();@H_404_8@如果您想要考虑到web.xml错误页面,这不是很简单.您需要解析整个web.xml以找到错误页面位置.此外,当渲染响应中发生异常时,您将基本需要自己重建整个视图. OmniFaces组件库具有这样的异常处理程序,即
FullAjaxExceptionHandler
.您可以找到完整的源代码here和展示示例@L_301_5@.也可以看看:
> using ExternalContext.dispatch in JSF error handler causes corrupt page rendering
> Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request