【问题标题】:JSF 2.0 AJAX Calls FailingJSF 2.0 AJAX 调用失败
【发布时间】:2011-06-20 20:48:37
【问题描述】:

我正在开发一个项目,以使用 JSF1.2、JSP、Struts、Tiles、Richfaces ... 来简单地使用 JSF2.0、内置 facelets 支持,并将 Richfaces 更新到版本 4。

到目前为止,一切进展顺利,除了一个主要路障。我正在尝试将以前使用 <a4j:support> 标签处理的 AJAX 组件更新为 <f:ajax> 标签,而不是按照我希望的方式工作,我收到了一个错误,我只能将其解释为我忘记了在配置一切方面的东西。

这是在 com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter() 方法中抛出的 NullPointerException。

当我第一次加载页面时,我可以在调试器中看到组件正确绑定到支持值;页面加载没有事故。当我尝试在所述组件上激活 AJAX 事件时,它就会爆炸。我收到一个错误,没有通过 AJAX 更新。我尝试转换的每个 AJAX 组件都会发生这种情况。这是一个这样的例子:

        <h:selectOneMenu
        value="#{userSession.selectedNetwork}"
        id="network"
        >
        <f:selectItems value="#{userSession.networkUIOptions}" />
        <f:ajax event="change" render="selectedStation edit_site_button add_site_button"/>
    </h:selectOneMenu>

我不知道这是否相关,但我在该代码中引用的 bean 现在被注释为 ala JSF2.0 并从 faces-config.xml 中删除,但是,我还没有完全摆脱的面孔-config.xml。仍在努力转换一切。另外,我在 Tomcat 6.0 上运行它。

任何帮助,建议将不胜感激。我真的被这个问题困住了。

编辑 1:

根据我下载的捆绑包标题使用 mojarra 版本 2.1.1。无法获得准确的堆栈跟踪。更改了这么多内容后,日志记录似乎无法正常工作。会继续努力。也会尝试简单的页面和报告结果。

编辑 2: 因此,尝试“最小”页面会产生相同的结果,相同的错误。

仍然无法完全正确地进行日志记录,因此只进行了一些 ghetto 日志记录。请参阅下面的类似正确堆栈跟踪的内容:

编辑 3: 好的,更新了带有行号的 ghetto 堆栈跟踪。你猜对了第​​一堂课的行号来抛出错误: http://pastebin.com/49yUDcPM

NPNSessionFilter.java的doFilter函数: http://pastebin.com/iwG0rcQ6

我为 BalusC 的建议创建的测试页面: http://pastebin.com/kSeUyj7g

编辑 4:

http://tinypic.com/r/2dca0yo/7 http://tinypic.com/r/16jet7s/7

这里是当前打包在 WAR 的 WEB-INF/lib 文件夹中的库的图像。以前的程序员包括很多我还没有清理的垃圾。同样,不确定 struts JAR 来自何处。删除了我能找到的与 strust 或 tile 相关的所有 pre-dist JAR。

编辑 5:

好的,突破!这条评论带来了天壤之别“同样,不确定 struts JAR 来自何处。删除了我能找到的与 strust 或 tile 相关的所有 pre-dist JAR。”

清洁耳朵,重新分配,现在情况更好了。显然,这不仅仅是我忘记删除的某个库,而是我忘记删除的一个库,然后在删除后清理了 EAR。 AJAX 请求现在可以正常通过,我可以看到调试器值在请求通过时被重新绑定!其他问题的负载,但可以在我自己的时间处理这些问题。 BalusC,你让我找到了这个解决方案;如果您想提交答案,我很乐意接受!

【问题讨论】:

  • 提及确切的 Mojarra 版本和完整的堆栈跟踪可能会有所帮助。当您使用非常简单的 ajax 表单(例如 &lt;h:form&gt;&lt;h:inputText value="#{sessionScope.input}"&gt;&lt;f:ajax event="keyup" render="output"/&gt;&lt;/h:inputText&gt;&lt;h:outputText id="output" value="#{sessionScope.input}"/&gt;&lt;/h:form&gt; 而没有支持 bean)创建简约页面时,是否也会出现此错误?
  • @BalusC 尽可能更新。将以最少的页面回复您。
  • @BalusC:现在更新了你要求的大部分细节。
  • 嗯,这是一个奇怪的痕迹。行号在哪里?发生此异常的行号非常重要。无论如何,在查看 Mojarra 2.1.1 源代码之后,我最好的猜测是第 442 行。NPNSessionFilter 到底在做什么?当您测试最小代码示例时,您是否将所有的 tile/richfaces/struts 标签都留在了 Facelets 页面之外?
  • @BalusC:用 pastebins 更新到相关的 NPNSessionFilter 代码,更新堆栈跟踪 w/ 行号和测试页标记。此外,NPNSessionFilter 的主要目的是在每个请求上运行一些自定义访问控制代码,而且它往往会捕获应用程序中发生的任何恶意错误,因此我能够在那里捕获错误。另外仅供参考,我尝试更新到 Mojarra 2.1.2,但 AFAICT 没有任何区别。此外,再次尝试了测试页面,没有提及 Richfaces、tomahawk 或 trinidad。但结果相同。

标签: ajax jsf facelets


【解决方案1】:

com.sun.faces.context.PartialViewContextImpl:PartialViewContextImpl.java:createPartialResponseWriter:441 处出现 NullPointerException

此异常表明 JSF 视图根为空,这反过来表明在类路径中有一些 JSF 1.2 目标第 3 方或自定义 ViewHandler 不能完全适合 JSF 2.0,因此需要也将升级(或完全删除)。

根据您的所有 JAR 概览的屏幕截图,struts-faces JAR 是主要嫌疑人。但是这些混合版本的 Apache Commons 和 JSTL 库看起来也不对。

【讨论】:

  • 除了@BalusC 关于删除不需要的库的观点之外,这里的另一个教训是确保您在构建之前清理您的项目,在对支持库进行重大更改时,您的底层框架项目。否则那些不需要的项目可能会徘徊并引起像我一样的头痛。
猜你喜欢
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
相关资源
最近更新 更多