如何处理 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:repeat
或 h:dataTable
)。
我正在按照 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:repeat
或 h:dataTable
)。