因此,在面对可怕的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>