JSF2.0在错误处理时,一些facesmessages没有发送到重定向页面

时间:2015-12-25 17:02:35

标签: java jsf jsf-2 error-handling tomee

我在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将显示,没有面部消息), 所以在这一刻,我决定采用重定向。

请帮帮我!感谢。

0 个答案:

没有答案