沉默FullAjaxExceptionHandler

blo*_*p3r 6 glassfish jsf-2 omnifaces

所以在面对可怕的事情后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.
...
Run Code Online (Sandbox Code Playgroud)

这很好,因为它是按预期处理的,但无论如何要将这个异常打印到server.log?这会快速占用日志.

我正在运行:
Mojarra 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-2013-07-01


Glassfish 3.1.2.2上

Bal*_*usC 6

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

}
Run Code Online (Sandbox Code Playgroud)

围绕它创建一个工厂:

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

}
Run Code Online (Sandbox Code Playgroud)

为了使其运行,请faces-config.xml以通常的方式将其注册为工厂(不要忘记删除原始注册FullAjaxExceptionHandlerFactory):

<factory>
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>
Run Code Online (Sandbox Code Playgroud)