我正在使用OmniFaces (1.7)FullAjaxExceptionHandler在 ajax 请求期间处理 (ViewExpired)Exception。
我不希望 FullAjaxExceptionHandler 像默认实现那样记录 SEVERE 级别的异常。所以我确实覆盖了 logException方法,但仍然调用默认方法而不是重写的方法。
我已经注册了以下工厂:
<factory>
<exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
<factory>
<exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
这是我的ViewExpiredExceptionHandlerFactory
public class ViewExpiredExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public ViewExpiredExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
ExceptionHandler result = parent.getExceptionHandler();
result = new ViewExpiredExceptionHandler(result);
return result;
}
}
和扩展的FullAjaxExceptionHandler
public class ViewExpiredExceptionHandler extends FullAjaxExceptionHandler {
private static final Logger LOGGER = Logger.getLogger(ViewExpiredExceptionHandler.class);
private ExceptionHandler wrapped;
public ViewExpiredExceptionHandler(ExceptionHandler wrapped) {
super(wrapped);
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getWrapped() {
return this.wrapped;
}
@Override
public void logException(FacesContext context, Throwable exception, String location, String message, Object... parameters) {
String user = UserFilter.readUserIdFromSession();
LOGGER.info("The view/session has expired for user " + (user == null ? "null" : user));
}
}
我错过了什么吗?
最佳答案
从faces-config.xml
中删除FullAjaxExceptionHandlerFactory
条目。现在,您基本上有两个完全不同的异常处理程序实例,每个实例都做自己的事情,其中后来注册的实例包装(因此优先于)先前注册的实例。然而,一旦遇到 ajax 异常,FullAjaxExceptionHandler
本身不会委托(delegate)给包装的异常处理程序。
所以,您所需要的只是这样:
<factory>
<exception-handler-factory>my.package.ViewExpiredExceptionHandlerFactory</exception-handler-factory>
</factory>
关于jsf - 不会调用 OmniFaces FullAjaxExceptionHandler 的 logException 方法重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21236920/