在我们的项目中,我们使用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)
我有以下问题:
FullAjaxExceptionHandler
没有捕获异常的原因,因为它在生命周期中被抛出太晚了?答案 0 :(得分:3)
我不会把它称为bug,但这有点不幸的设计,懒惰模型由FilterFeature调用,在渲染阶段由encode *方法调用。
在JSF中,您的业务逻辑代码(例如获取数据)预计将在应用程序阶段启动,因此,许多功能不适用于延迟加载并不令人惊讶。其他一些无效的方法是在代码中请求组件更新:
RequestContext.getInstance().update("componentId")
为了更新组件,我不得不添加JavaScript调用:
RequestContext.getInstance().execute("triggerUpdate('componentId')")
在您的情况下,添加JavaScript调用可能是一种可行的解决方法。 JavaScript调用只是添加到响应XML中,因此它们可以在每个阶段工作(这可以解决我的情况 - 请求更新)。