处理 AJAXified 组件的 JSF 2.0 异常的正确方法是啥?

Posted

技术标签:

【中文标题】处理 AJAXified 组件的 JSF 2.0 异常的正确方法是啥?【英文标题】:What is the correct way to deal with JSF 2.0 exceptions for AJAXified components?处理 AJAXified 组件的 JSF 2.0 异常的正确方法是什么? 【发布时间】:2012-05-14 01:25:04 【问题描述】:

我已设置 web.xml,以便任何 java.lang.Throwable(即任何未捕获的异常或错误)都将转发到错误页面。但是,对于 AJAXified 组件,异常不会通过此机制路由到错误页面。

我的测试用例是一个简单的CommandButton,绑定到一个总是抛出RuntimeException 的动作方法。似乎最好的做法是让操作方法捕获异常并添加类型为错误严重性的FacesMessage。这是人们做的吗?有没有办法配置 JSF,以便在 AJAXified 组件的支持 bean 方法抛出异常时可以显示错误页面?

【问题讨论】:

【参考方案1】:

您需要为此实现自定义 ExceptionHandler,当 ajax 请求中发生异常时,基本上会执行以下操作:

String errorPageLocation = "/WEB-INF/errorpages/500.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();

如果您想将web.xml 错误页面考虑在内,这并非微不足道。您需要解析整个 web.xml 才能找到错误页面位置。此外,当渲染响应期间发生异常时,您基本上需要自己重建整个视图。 OmniFaces 组件库正好有这样一个异常处理程序,FullAjaxExceptionHandler。您可以找到完整的源代码here 和展示示例here。

另见:

using ExternalContext.dispatch in JSF error handler causes corrupt page rendering Session timeout and ViewExpiredException handling on JSF/PrimeFaces ajax request

【讨论】:

以上是关于处理 AJAXified 组件的 JSF 2.0 异常的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

向 JSF 2.0 UIInput 组件添加自定义属性 (HTML5) 支持

JSF 2.0 动态删除组件

JSF 2.0 复合组件 - ajax 渲染参数 OUTSIDE 组件定义

jsf 2.0 自定义组件/标签不复合

在哪里放置组合组件?(JSF 2.0)

JSF 2.0:跨多个视图保留组件状态