不会调用覆盖OmniFaces FullAjaxExceptionHandler的logException方法

时间:2014-01-20 14:48:22

标签: jsf jsf-2 omnifaces viewexpiredexception

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

我不希望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));
  }

}

我错过了什么吗?

1 个答案:

答案 0 :(得分:2)

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

所以,你所需要的就是这个:

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