2

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));
  }

}

何か不足していますか?

4

1 に答える 1