Тишина FullAjaxExceptionHandler

Поэтому, столкнувшись со страшной javax.faces.application.ViewExpiredException, мне пришлось поискать в Интернете правильное решение. К счастью, решения легко доступны, и я пошел дальше и принял OmniFaces FullAjaxExceptionHandler.

Достаточно сказать, как и почти все в OmniFaces, это творило чудеса. Но каждый раз, когда у меня истекает срок действия, я получаю:

SEVERE: WebModule[/myModule]FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/WEB-INF/errorpages/test.xhtml' will be shown.
javax.faces.application.ViewExpiredException: viewId:/my/page.xhtml - View /my/page.xhtml could not be restored.
...

Это нормально, поскольку обрабатывается, как и ожидалось, но можно ли каким-либо образом отключить вывод этого исключения в server.log? Это довольно быстро заполнило бы журнал.

Я использую:
Mojarra 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-01-07-2013

на
Glassfish 3.1.2.2


person blo0p3r    schedule 01.08.2013    source источник


Ответы (1)


Согласно OmniFaces 1.6, вы можете расширить его и переопределить метод logException(), как показано ниже, чтобы пропустить трассировку стека для ViewExpiredException .

public class YourAjaxExceptionHandler extends FullAjaxExceptionHandler {

    public YourAjaxExceptionHandler(ExceptionHandler wrapped) {
        super(wrapped);
    }

    @Override
    protected void logException(FacesContext context, Throwable exception, String location, String message, Object... parameters) {
        if (exception instanceof ViewExpiredException) {
            // With exception==null, no trace will be logged.
            super.logException(context, null, location, message, parameters);
        }
        else {
            super.logException(context, exception, location, message, parameters);
        }
    }

}

Создайте фабрику вокруг него:

public class YourAjaxExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory wrapped;

    public YourAjaxExceptionHandlerFactory(ExceptionHandlerFactory wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new YourAjaxExceptionHandler(getWrapped().getExceptionHandler());
    }

    @Override
    public ExceptionHandlerFactory getWrapped() {
        return wrapped;
    }

}

Чтобы запустить это, зарегистрируйте его как factory в faces-config.xml обычным способом (не забудьте удалить исходную регистрацию для FullAjaxExceptionHandlerFactory):

<factory>
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>
person BalusC    schedule 02.08.2013
comment
@BalusC в MyAjaxExceptionHandler#logException отсутствует переключатель. Эта строка должна быть внутри else: super.logException(context, exception, location, message, parameters);. Кроме того, если я не ошибаюсь, Faces-config.xml <exception-handler-factory> должен быть com.example.MyAjaxExceptionHandlerFactory. - person Patrick Garner; 20.07.2015