我正在使用FullAjaxExceptionHandler来处理ajax请求中的超时问题。我面临的问题是处理javax.faces.view.facelets.FaceletException。如果我在xhtml页面中有错误,我不想显示堆栈跟踪而是显示错误页面。这是我通过在web.xml中指定错误页面来实现的。问题是我想记录这个错误。我正在使用log4j进行其他异常,但是如何为FaceletException编写处理程序。如果编写另一个异常处理程序,那么我应该指定处理程序类,因为我已经在使用FullAjaxExceptionHandler。
faces-config.xml中:
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
<factory>
<exception-handler-factory>org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory</exception-handler-factory>
</factory>
<render-kit>
<renderer>
<component-family>org.primefaces</component-family>
<renderer-type>org.primefaces.component.ScheduleRenderer</renderer-type>
<renderer-class>com.example.domain.web.custom.MyScheduleRenderrer</renderer-class>
</renderer>
</render-kit>
答案 0 :(得分:0)
不幸的是,似乎你不能同时拥有这两者。
ExceptionHandlerFactory
期待配置单一类型FullAjaxExceptionHandler
的来源,如果异常是非ajax,则重新抛出,由<error-page>
机制处理。您必须扩展或包装FullAjaxExceptionHandler
以提供Ajax和非Ajax异常处理
答案 1 :(得分:0)
在faces-config.xml中添加自定义异常处理程序工厂
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
<factory>
<exception-handler-factory>com.fetchinglife.domain.web.permissions.CustomExceptionHandlerFactory</exception-handler-factory>
</factory>
创建自定义异常处理程序工厂
public class CustomExceptionHandlerFactory extends ExceptionHandlerFactory{
private ExceptionHandlerFactory wrapped;
public CustomExceptionHandlerFactory(ExceptionHandlerFactory wrapped) {
this.wrapped = wrapped;
}
@Override
public ExceptionHandler getExceptionHandler() {
return new CustomExceptionHandler(wrapped.getExceptionHandler());
}
@Override
public ExceptionHandlerFactory getWrapped() {
return wrapped;
}
}
创建自定义异常处理程序
public class CustomExceptionHandler extends FullAjaxExceptionHandler{
static Logger log = Logger
.getLogger(CustomExceptionHandler.class);
public CustomExceptionHandler(ExceptionHandler wrapped) {
super(wrapped);
}
@Override
public void handle() throws FacesException {
Iterator<ExceptionQueuedEvent> unhandledExceptionQueuedEvents = getUnhandledExceptionQueuedEvents().iterator();
if(unhandledExceptionQueuedEvents.hasNext()){
Throwable exception = unhandledExceptionQueuedEvents.next().getContext().getException();
log.error("FL Error",exception);
}
super.handle();
}
}