因此,在面对可怕的javax.faces.application.ViewExpiredException之后,我不得不四处看看互联网以找到合适的解决方案。幸运的是,这些解决方案很容易获得,因此我继续采用OmniFaces FullAjaxExceptionHandler

足够用了,与OmniFaces的几乎所有功能一样,它产生了奇迹。但是,每当我有一个过期的 View 时,我都会得到:

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.
...

可以按预期进行处理,这很好,但是是否可以使此异常安静下来,使其不打印到服务器上。这会很快挤满日志。

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


玻璃鱼3.1.2.2

最佳答案

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

}

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

<factory>
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>

10-05 19:56