2014-01-20 2 views
2

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

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

} 

Я что-то пропустил?

ответ

2

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

Таким образом, все, что вам нужно, это просто так:

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

Очень логика и теперь :-) Спасибо BalusC работает отлично. – jimmybondy

+0

Добро пожаловать. – BalusC

+0

Еще один вопрос: я предполагаю, что нет необходимости указывать браузеру не кэшировать динамические JSF-страницы, как описано здесь http://stackoverflow.com/questions/3642919/javax-faces-application-viewexpiredexception-view-could -не-восстанавливается/3642969 # 3642969, правильно? – jimmybondy

Смежные вопросы