【问题标题】:Exceptions thrown from LazyDataModel#load() are not caught by ExceptionHandler从 LazyDataModel#load() 抛出的异常不会被 ExceptionHandler 捕获
【发布时间】:2013-09-12 14:12:27
【问题描述】:

在我们的项目中,我们使用 PrimeFaces 3.3 和 OmniFaces FullAjaxExceptionHandler,如 this blog 中所述。

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-09-16
      • 2021-01-15
      • 1970-01-01
      • 2010-10-14
      • 2011-02-21
      • 1970-01-01
      • 2016-02-17
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多