bean的@PostConstruct期间的异常不会在右侧<error-page> </error-page>中结束

时间:2014-07-10 08:15:10

标签: jsf exception-handling jsf-2.2 omnifaces postconstruct

我的问题很简单(要问)。如何在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!");
}

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

Omnifaces unwrap方法将停止发生FacesException,CDI(Weld)会在Bean初始化期间将任何异常包装到FacesException(我假设符合规范) )。

我可以编写自己的异常过滤器,它不会停止展开FacesException,你很快就会意识到你可能会更深入地了解堆栈跟踪。

如何在Bean初始化期间管理例外?

1 个答案:

答案 0 :(得分:2)

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

您最好将此安全检查逻辑转移到其他位置。例如。一个真正的安全框架(通过JAAS / JASPIC管理的容器或像Shiro这样的第三方),或servlet过滤器,或者如果你 真的非常想把它放在&#34; JSF的房子里,而是使用<f:viewAction>代替。

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

(别忘了删除@PostConstruct注释)

如果您还没有使用JSF 2.2,请改用preRenderView事件。

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

另见: