ExceptionHandler不会捕获从LazyDataModel#load()抛出的异常

时间:2013-09-12 14:12:28

标签: ajax jsf-2 primefaces exception-handling lazy-loading

在我们的项目中,我们使用PrimeFaces 3.3和OmniFaces FullAjaxExceptionHandler this blog中描述的{{3}}。

它适用于所有Ajax调用,除了我们在扩展PrimeFaces load()的类中实现LazyDataModel方法的异常。在load()方法中抛出异常后,它不会显示在handleAjaxException()类的FullAjaxExceptionHandler方法中的迭代器中:

Iterator<ExceptionQueuedEvent> unhandledExceptionQueuedEvents = getUnhandledExceptionQueuedEvents().iterator();

Ajax调用中抛出的所有其他异常最终都会出现在迭代器中。

我比较了堆栈跟踪,这就是我发现的:当使用PrimeFaces延迟加载时,堆栈跟踪显示它在渲染响应阶段发生:

at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:391)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)

在调用应用程序阶段发生非延迟加载错误:

at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)

我有以下问题:

  1. FullAjaxExceptionHandler没有捕获异常的原因,因为它在生命周期中被抛出太晚了?
  2. 这是PrimeFaces的错误吗?

1 个答案:

答案 0 :(得分:3)

我不会把它称为bug,但这有点不幸的设计,懒惰模型由FilterFeature调用,在渲染阶段由encode *方法调用。

在JSF中,您的业务逻辑代码(例如获取数据)预计将在应用程序阶段启动,因此,许多功能不适用于延迟加载并不令人惊讶。其他一些无效的方法是在代码中请求组件更新:

RequestContext.getInstance().update("componentId")

为了更新组件,我不得不添加JavaScript调用:

RequestContext.getInstance().execute("triggerUpdate('componentId')")

在您的情况下,添加JavaScript调用可能是一种可行的解决方法。 JavaScript调用只是添加到响应XML中,因此它们可以在每个阶段工作(这可以解决我的情况 - 请求更新)。