正常 AND ajax 请求的异常处理程序,用于记录目的

Exception Handler for normal AND ajax request for logging purpose

谁能给我一个 ExceptionHandler 的工作示例,它为 正常和 ajax 请求 扩展了 ExceptionHandlerWrapper。我不想使用过滤器。我希望我所有的异常处理都在一个入口处以用于记录目的。

在 Omnifaces 中,我们有 FullAjaxExceptionHandler 只有 用于 ajax 请求。我如何重构此 class 以考虑两种类型的请求?

为了在我的 CustomExceptionHandler 中呈现错误页面,我在一个实用程序方法中使用了这样一条语句来标识请求的类型(正常或 ajax)

if (context.getPartialViewContext().isAjaxRequest()) {
      ViewHandler viewHandler = context.getApplication().getViewHandler();
      UIViewRoot viewRoot = viewHandler.createView(context, errorPageLocation);
      context.setViewRoot(viewRoot);
      context.getPartialViewContext().setRenderAll(true);
      context.renderResponse();
} else {
      NavigationHandler nav = context.getApplication().getNavigationHandler();
      nav.handleNavigation(context, null, errorPageLocation);
      context.renderResponse();
}

通过这种方式,我可以在我的 CustomExceptionHandler 中有效地处理这两个请求

在你可以使用的Wrapper中,如果你想检测请求的类型:

context == null || !context.getPartialViewContext().isAjaxRequest()

还建议您将 WrapperHandler 与 Deltaspike Exception Control

集成

最后是一种通用的重定向方式(适用于两种类型的请求):

public static void redirect(FacesContext fc, String view) {
    ExternalContext ec = fc.getExternalContext();
    String path = ec.encodeResourceURL(fc.getApplication().getViewHandler().getActionURL(fc, view));
    try {
        ec.redirect(path);
    } catch(Exception e) {
        throw new RuntimeException();
    }
}