jsf - bean 的 @PostConstruct 期间的异常不会在正确的 <error-page> 中结束

标签 jsf exception jsf-2.2 omnifaces postconstruct

我的问题很简单(问)。如何在 JSF 应用程序中创建和管理异常?

首先我们将普通请求和 Ajax 请求分开。 使用 FullAjaxExceptionHandler 解决了问题由 Omnifaces 提供。

好的,现在我的 Ajax 异常遵循 JSF/web.xml 路径。下一步是在 web.xml 中创建映射:

<error-page>
    <exception-type>java.lang.SecurityException</exception-type>
    <location>/errors/security.xhtml</location>
</error-page>

问题是异常不会匹配上述规则,因为它们已被其他异常类型包装。 好的,Omnifaces 再次来救援 FacesExceptionFilter .

好的,现在我可以从我的 bean 中抛出异常,例如

@PostConstruct
public void init() {
    throw new SecurityException("Go away!");
}

不幸的是,这不起作用,因为异常是在 bean 初始化期间抛出的,而不是在调用方法时抛出的。

Omnifaces unwrap 方法将停止到出现 FacesException 时,CDI (Weld) 会将 Bean 初始化期间的任何异常包装为 FacesException (我认为符合规范)。

我可以编写自己的异常过滤器,它不会停止解包 FacesException,您很快就会意识到,您可能会比人们想要的更深入地了解堆栈跟踪。

如何在 Bean 初始化期间管理异常?

最佳答案

托管 Bean 创建和初始化不应首先引发异常。

您最好将此安全检查逻辑移到其他地方。例如。一个真正的安全框架(通过 JAAS/JASPIC 或 Shiro 等第 3 方管理的容器),或 servlet 过滤器,或者如果您 真的很想将其保留在“JSF house”中,请使用 <f:viewAction>相反。

<f:viewAction action="#{bean.init}" />

(不要忘记删除 @PostConstruct 注释)

如果您尚未使用 JSF 2.2,请使用 preRenderView而是事件。

<f:event type="preRenderView" listener="#{bean.init}" />

另请参阅:

关于jsf - bean 的 @PostConstruct 期间的异常不会在正确的 <error-page> 中结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24671525/

相关文章:

css - 更改图形图像中特定部分的颜色

xml - 在 JSF 中读写 XML 文件

java - 我看到 "Re-entry is not allowed"是什么意思?

java - Primefaces 4 文件上传处理程序未调用

JSF 2.2 面配置 : Unknown Schema version: 2. 2

java - 如何在 PrimeFaces 数据表列中显示带有换行符( pretty-print )的 XML 内容?

javascript - 如何使用 native JavaScript 在 HTML DOM 事件上调用 JSF 托管 bean?

html - 手机上的 JSF 应用程序 - 不在 div 中滚动

python - 仅打印一个单词的异常

java - 在 Spring Security 中处理自定义异常