我的问题很简单(问)。如何在 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/