jsf - 不会调用 OmniFaces FullAjaxExceptionHandler 的 logException 方法重写

标签 jsf jsf-2 omnifaces viewexpiredexception

我正在使用OmniFaces (1.7)FullAjaxExceptionHandler在 ajax 请求期间处理 (ViewExpired)Exception。

我不希望 FullAjaxExceptionHandler 像默认实现那样记录 SEVERE 级别的异常。所以我确实覆盖了 logException方法,但仍然调用默认方法而不是重写的方法。

我已经注册了以下工厂:

  <factory>
    <exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
  </factory>

  <factory>
      <exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
  </factory>

这是我的ViewExpiredExceptionHandlerFactory

public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {

  private ExceptionHandlerFactory parent;

  public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
    this.parent = parent;
  }

  @Override
  public ExceptionHandler getExceptionHandler() {
    ExceptionHandler result = parent.getExceptionHandler();
    result = new ViewExpiredExceptionHandler(result);

    return result;
  }

}

和扩展的FullAjaxExceptionHandler

public class ViewExpiredExceptionHandler extends FullAjaxExceptionHandler {

  private static final Logger LOGGER = Logger.getLogger(ViewExpiredExceptionHandler.class);

  private ExceptionHandler wrapped;

  public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
    super(wrapped);
    this.wrapped = wrapped;
  }

  @Override
  public ExceptionHandler getWrapped() {
    return this.wrapped;
  }

  @Override
  public void logException(FacesContext context, Throwable exception, String location, String message, Object... parameters) {
    String user = UserFilter.readUserIdFromSession();
    LOGGER.info("The view/session has expired for user " + (user == null ? "null" : user));
  }

}

我错过了什么吗?

最佳答案

faces-config.xml 中删除FullAjaxExceptionHandlerFactory 条目。现在,您基本上有两个完全不同的异常处理程序实例,每个实例都做自己的事情,其中​​后来注册的实例包装(因此优先于)先前注册的实例。然而,一旦遇到 ajax 异常,FullAjaxExceptionHandler 本身不会委托(delegate)给包装的异常处理程序。

所以,您所需要的只是这样:

<factory>
    <exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>

关于jsf - 不会调用 OmniFaces FullAjaxExceptionHandler 的 logException 方法重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21236920/

相关文章:

java - 如何解决Primefaces中的 "p:message not working"?

ajax - 如何在 Ajax 请求期间在 JSF2 中动态添加组件

jsf - 将图标添加到 p :panel?

jsf - 从外部文件系统或数据库获取 Facelets 模板/文件

jsf-2 - JSF 2.1 和接缝 : s:token still required

jsf-2 - 将 JSF 托管 Bean 迁移到 CDI 托管 Bean

JSF 传递参数的最佳方式

session - 如何在 JSF 2.0 中使 session 失效?

java - 尽管原始文件有效,但从服务器下载的 PDF 无效

jsf - WELD-001519 为抽象类 'xxx' 创建了一个 InjectionTarget 实现。不可能产生这种类型的实例