【发布时间】: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 表单(例如
<h:form><h:inputText value="#{sessionScope.input}"><f:ajax event="keyup" render="output"/></h:inputText><h:outputText id="output" value="#{sessionScope.input}"/></h:form>而没有支持 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。但结果相同。