JSF跳过了某些阶段 - 如何调试?

4
我正在调试一个外国的JSF应用程序。 问题是,我提交了一个表单,但值没有被传递过去。
通过一个阶段监听器,我可以看到生命周期没有完全运行,也就是说跳过了第2-5个阶段:在还原视图阶段之后,直接调用了呈现响应阶段。我错过了应用值、验证、更新模型操作等步骤。
所以,这可能是鸡生蛋问题: 1. 负责的阶段没有被调用,因此新的表单输入无法被传递。 2. 系统没有识别任何新的输入,因此在恢复视图后直接呈现。
我检查了是否有responseComplete()或renderResponse()的调用。
我有些困惑。有没有想法来验证这两个假设中的一个?或者如何一般性地进行调试?有人遇到过类似的问题吗?
更新
我怀疑JSF不知道postback请求,并将其处理为初始视图。这解释了为什么我只通过了阶段1和6。
如何检查JSF是否将其识别为非faces请求? 如何检查当前facesContext中是否有适当的treeID?
2个回答

7
我引用我之前发布的一个答案:(链接)

每当UICommand组件无法调用关联的操作时,请验证以下内容:

  1. UICommand组件必须放置在UIForm组件内(例如h:form)。
  2. 您不能将多个UIForm组件嵌套在彼此中(请注意包含文件!)。
  3. 不应出现任何验证/转换错误(使用h:messages获取所有错误)。
  4. 如果UICommand组件位于UIData组件内,请确保完全相同的DataModelUIDatavalue属性后面的对象)已被保存。
  5. 在应用请求值阶段期间,组件及其所有父组件的rendereddisabled属性都不应该求值为false
  6. 确保请求-响应链中没有PhaseListener或任何EventListener更改了JSF生命周期以跳过调用操作阶段。
  7. 确保请求-响应链中没有FilterServlet阻止了某种方式的FacesServlet请求。
由于在您的特定情况下跳过了阶段2-5,并且您确定(?)未调用FacesContext#renderResponse(),因此可以从列表中删除原因3、6和7。根据您调试JSF阶段的方式,原因4和5也可能被删减。调查其他原因。我认为是原因2。检查是否在生成的HTML源代码中看到<form><form></form></form>,并在JSF源中回溯这一点。

谢谢,我会检查的。其他想法仍然受欢迎 :-) - Peter Wippermann
请先确认您是否排除了所有内容。 - BalusC
我已经检查了一切,似乎应用本身没有问题,但是服务器/JSF/配置方面存在问题。我不知道那里可能会出现什么错误。 - Peter Wippermann
你在JSF页面中使用了binding属性吗?如果是这样,你是否确保它们各自指向自己的属性(因此不共享其他属性)? - BalusC
唯一的绑定出现在以下位置: <f:subview id="aktuelleVorgaengeListe" binding="#aktuelleVorgaengeBB.aktuelleVorgaengeSubview}"> <%@include file="fragment/AktuelleVorgangsListeFragment.jsp"%> </f:subview>很抱歉,我不明白问题可能出在哪里。 - Peter Wippermann
@include?最好使用<jsp:include>。这可能也是问题的原因。下一步应该是检查生成的HTML输出是否正确,并在表单提交期间检查请求头/正文。 - BalusC

0
找到解决方案了! 很抱歉,我想这可能与应用程序有关:JSF的自定义StateManager在JSF 1.2中无法使用。这导致了这个奇怪的错误。 已经修复了StateManager,一切都正常工作了。这很痛苦,浪费了很多时间 :-(
无论如何,还是谢谢你的帮助 :-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接