Переопределение метода logException OmniFaces FullAjaxExceptionHandler не вызывается

Я использую OmniFaces (1.7) FullAjaxExceptionHandler для обработки исключений (ViewExpired) во время запросов ajax.

Я не хочу, чтобы 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));
  }

}

Я что-то упускаю?


person jimmybondy    schedule 20.01.2014    source источник


Ответы (1)


Удалите запись FullAjaxExceptionHandlerFactory из faces-config.xml. Прямо сейчас у вас есть два совершенно разных экземпляра обработчика исключений, каждый из которых выполняет свою собственную функцию, в результате чего более поздний зарегистрированный оборачивает (и, таким образом, имеет приоритет над) ранее зарегистрированный. Однако FullAjaxExceptionHandler сам по себе не делегирует завернутый, как только возникает исключение ajax.

Итак, все, что вам нужно, это только это:

<factory>
    <exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
person BalusC    schedule 20.01.2014
comment
Еще один вопрос: я предполагаю, что нет необходимости указывать браузеру не кэшировать динамические страницы JSF, как описано здесь stackoverflow.com/questions/3642919/, верно? - person jimmybondy; 20.01.2014