【问题标题】:Silence FullAjaxExceptionHandler沉默 FullAjaxExceptionHandler
【发布时间】:2013-08-01 19:54:09
【问题描述】:

所以在遇到可怕的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 中?这会很快挤满日志。

我正在跑步:
莫哈拉 2.1.23
PrimeFaces 4.0-SNAPSHOT
OmniFaces 1.6-SNAPSHOT-2013-07-01


玻璃鱼 3.1.2.2

【问题讨论】:

    标签: jsf-2 glassfish omnifaces


    【解决方案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;
        }
    
    }
    

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

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

    【讨论】:

    • @BalusC 在MyAjaxExceptionHandler#logException 中缺少一个开关。此行需要在 else 中:super.logException(context, exception, location, message, parameters);。另外,如果我没记错的话 faces-config.xml &lt;exception-handler-factory&gt; 需要是 com.example.MyAjaxExceptionHandlerFactory。
    猜你喜欢
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 2020-01-22
    相关资源
    最近更新 更多