如果我已经在使用FullAjaxExceptionHandler,如何记录特定的异常

时间:2014-02-10 05:18:04

标签: jsf omnifaces exceptionhandler

我正在使用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>

2 个答案:

答案 0 :(得分:0)

不幸的是,似乎你不能同时拥有这两者。

  • 来自JSF规范,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();
}

}