3

在我们的项目中,我们使用 PrimeFaces 3.3 和OmniFacesFullAjaxExceptionHandler,如本博客所述。

它对所有 Ajax 调用都非常有效,除了我们load()在扩展 PrimeFaces 的类中的方法实现中的异常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 错误吗?
4

1 回答 1

3

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

在 JSF 中,您的业务逻辑代码(例如获取数据)预计将在应用程序阶段启动,因此许多功能不适用于延迟加载也就不足为奇了。其他不起作用的事情之一是在代码中请求组件更新:

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

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

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

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

于 2013-09-13T07:48:00.007 回答