Mad*_*eox 3 jsf logging exception-handling
我想使用log4j检查并记录我的JSF Web应用程序中的所有未处理的异常.我使用log4j阅读了这篇文章中的日志运行时异常,并添加了一个实现的类Thread.UncaughtExceptionHandler
.但是方法没有解雇.
实现这一目标的正确方法是什么?
Java EE Web应用程序中通常没有未捕获异常的方法,因为服务器最终捕获来自Web应用程序的任何异常,并在HTTP 500错误页面中出现同步HTTP请求时显示异常(在异步(ajax)请求的情况下) ,这又依赖于框架).此外,如果真的有一个未被捕获的异常从服务器的注意力中逃脱,它将杀死服务器的运行时线程,导致整个服务器停止.这显然不是一个理想的现实世界场景.
JSF为您提供ExceptionHandler
API以获取这些异常并在必要时控制它们.
这是一个启动示例:
public class YourExceptionHandler extends ExceptionHandlerWrapper {
private ExceptionHandler wrapped;
public YourExceptionHandler(ExceptionHandler wrapped) {
this.wrapped = wrapped;
}
@Override
public void handle() throws FacesException {
FacesContext facesContext = FacesContext.getCurrentInstance();
for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
Throwable exception = iter.next().getContext().getException(); // There it is!
// Now do your thing with it. As per the question, you want to log it using log4j.
logger.error("An exception occurred!", exception);
}
getWrapped().handle();
}
@Override
public ExceptionHandler getWrapped() {
return wrapped;
}
}
Run Code Online (Sandbox Code Playgroud)
要使其运行,请ExceptionHandlerFactory
按如下方式创建自定义:
public class YourExceptionHandlerFactory extends ExceptionHandlerFactory {
private ExceptionHandlerFactory parent;
public YourExceptionHandlerFactory(ExceptionHandlerFactory parent) {
this.parent = parent;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new YourExceptionHandler(parent.getExceptionHandler());
}
}
Run Code Online (Sandbox Code Playgroud)
需要注册的faces-config.xml
内容如下:
<factory>
<exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
971 次 |
最近记录: |