2

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

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

好的,现在我的 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!");
}

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

Omnifacesunwrap方法将停止到 a 的发生,FacesException并且 CDI (Weld) 将在Bean初始化期间将任何异常包装到 FacesException (我假设它符合规范)。

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

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

4

1 回答 1

2

托管 bean 创建和初始化不应该首先抛出异常。

你最好把这个安全检查逻辑移到别处。例如,真正的安全框架(通过 JAAS/JASPIC 或 Shiro 等第三方管理的容器)或 servlet 过滤器,或者如果您真的想将其保留在“JSF 之家”中,请<f:viewAction>改用。

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

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

如果您还没有使用 JSF 2.2,请改用preRenderViewevent。

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

也可以看看:

于 2014-07-10T12:39:26.247 回答