自定义FullAjaxExceptionHandler以仅显示特定异常的faces消息

时间:2015-12-07 22:30:27

标签: ajax jsf exception-handling omnifaces

我正在研究使用omnifaces的JSF应用程序。我通过扩展FullAjaxExceptionHandler并覆盖shouldHandleExceptionRootCause()来为所有ajax请求提供自定义异常处理程序类。在这里,我将业务错误添加到上下文中,我必须在xhtml页面中显示这些消息。 ajax调用是使用p:commandButton从客户端调用的。 但是我在自定义异常处理程序中在上下文中设置的值没有显示在xhtml页面上。

public class CustomExceptionHandler extends FullAjaxExceptionHandler {

@Override
protected boolean shouldHandleExceptionRootCause(FacesContext context, Throwable exception) {

context.addMessage(null, FacesMessage);
context.getApplication().getNavigationHandler().handleNavigation(context, null, null);
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();
setRequest(request, baseRunTimeException);
return false;
}
}

但是我在上下文中添加的消息没有显示在p:messages标签

如果这种方法有任何问题,请告诉我?

1 个答案:

答案 0 :(得分:0)

根据评论中的功能要求,

  

我不想将所有异常显示为消息,其中一些我将重定向到另一个错误页面。

如果你想转发(不是重定向)到错误页面,只需让shouldHandleExceptionRootCause()方法返回true并以web.xml方式注册这些错误页面。< / p>

在那些您想要显示为面部消息的消息上,只需添加所需的面部消息,然后返回false

以下示例假设您希望将示例性自定义com.example.SystemException的消息显示为面部消息。

@Override
protected boolean shouldHandleExceptionRootCause(FacesContext context, Throwable exception) {
    if (exception instanceof SystemException) {
        Messages.addGlobalError(exception.getMessage());
        return false; // Don't show error page, just stay in same page.
    }

    return true; // Show error page as usual for other exceptions.
}