我在TomEE1.7.3上构建JSF2.0应用程序, 我已经创建了一个自定义的ExceptionHander,并覆盖了handle()方法, 如下所示:
@Override
public void handle() {
for (Iterator<ExceptionQueuedEvent> it = getUnhandledExceptionQueuedEvents().iterator(); it.hasNext();) {
ExceptionQueuedEventContext eventContext = it.next().getContext();
FacesContext facesContext = eventContext.getContext();
ExternalContext externalContext = facesContext.getExternalContext();
Throwable throwable = eventContext.getException();
if (throwable instanceof ViewExpiredException) {
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_INFO, "",
"oops, view state error! This FacesMessage is sent to error.xhtml, just as expected."));
} else {
facesContext.addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_INFO, "",
"oops, some OTHER error! This FacesMessage is NOT sent to error.xhtml, " +
"I want full stacktrace here, string length is irrelevant to the problem ..."));
}
externalContext.getFlash().setKeepMessages(true);
externalContext.redirect("error.xhtml");
it.remove();
}
wrapped.handle();
}
当我捕获一个可抛出的ViewExpiredException时,我可以在&#34; ErrorBean&#34;的@PostConstruct方法中获取FacesMessages(附加到&#34; error.xhtml&#34;)。但是如果有任何其他类型的throwable,我不能得到任何FacesMessages。 &#34; ErrorBean&#34;是一个带有这两个注释的支持bean类:
@javax.faces.bean.ManagedBean
@javax.enterprise.context.RequestScoped
我假设它与JSF&#34;的生命周期有关, 或者也许是因为我有2个豆子连接到1页, 但我无法弄清楚为什么会这样。
顺便说一下,我真正想做的是在同一个网址上输出堆栈跟踪(没有http 3xx重定向),我尝试了类似下面的内容:final ConfigurableNavigationHandler nav = (ConfigurableNavigationHandler)
facesContext.getApplication().getNavigationHandler();
nav.performNavigation("error.xhtml");
但也没有解决(此页面的另一个bean将显示,没有面部消息), 所以在这一刻,我决定采用重定向。
请帮帮我!感谢。