我的问题很简单(要问)。如何在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
初始化期间管理例外?
答案 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}" />