gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:51:43 27 4
gpt4 key购买 nike

在我们的项目中,我们使用 PrimeFaces 3.3 以及 OmniFaces FullAjaxExceptionHandlerthis blog 中所述.

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

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 的错误吗?

最佳答案

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

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

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

为了更新组件,我必须添加 JavaScript 调用:

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

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

关于ajax - 从 LazyDataModel#load() 抛出的异常不会被 ExceptionHandler 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18766645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com