如何处理 JSF 多个意外异常?

How to handle JSF multiple unexpected exception?

我正在按照 JSF 2.0 文档 https://cwiki.apache.org/confluence/display/MYFACES/Handling+Server+Errors 实现一个 ExceptionHandlerFactory 来处理我的应用程序中的意外错误。该实现适用于大多数场景。然而,当我关闭我的数据库时,发生了几个错误,并且初始化生成了多个连接异常,如 java.sql.SQLException、hibernate 异常、bean 注入异常等。方法 handle() 被执行多次也重定向到错误页面多次。句柄代码如下:

public void handle() throws FacesException {

    final Iterator<ExceptionQueuedEvent> i = getUnhandledExceptionQueuedEvents().iterator();
    while (i.hasNext()) {
        ExceptionQueuedEvent event = i.next();
        ExceptionQueuedEventContext context =
                (ExceptionQueuedEventContext) event.getSource();

        // get the exception from context
        Throwable t = context.getException();

        final FacesContext fc = FacesContext.getCurrentInstance();
        final Map<String, Object> requestMap = fc.getExternalContext().getRequestMap();
        final NavigationHandler nav = fc.getApplication().getNavigationHandler();

        //here you do what ever you want with exception
        try {

            //log error ?
            log.log(Level.SEVERE, "Critical Exception!", t);

            //redirect error page
            requestMap.put("exceptionMessage", t.getMessage());
            nav.handleNavigation(fc, null, "/error");
            fc.renderResponse();

            // remove the comment below if you want to report the error in a jsf error message
            //JsfUtil.addErrorMessage(t.getMessage());

        } finally {
            //remove it from queue
            i.remove();
        }
    }
    //parent hanle
    getWrapped().handle();
}

我在 Firefox 调试控制台中看到超过 15 个错误页面请求。 防止多次重定向的最佳方法是什么? 谢谢

您确实可以为每个请求发送 1 个响应。其中一种方法是将 while 替换为 if 并删除另一个 while 中的所有剩余异常。无论如何,第一个例外是最有趣的。所有其他例外只是后果。

if (i.hasNext()) {
    // Original code here.
}

while (i.hasNext()) {
    i.next();
    i.remove();
}

你可以获得inspiration from FullAjaxExceptionHandler of JSF utility library OmniFaces.

另一种方法是收集某个列表中的所有异常,然后呈现一个错误页面,其中相应地在某个迭代组件中显示该列表(例如 ui:repeath:dataTable)。