【问题标题】:JSF skips phases - How to debug that?JSF 跳过阶段 - 如何调试?
【发布时间】:2010-04-26 10:31:16
【问题描述】:

我正在调试一个外部 JSF 应用程序。 问题是,我提交了一个表单,但是这些值没有被继承。

使用阶段监听器我可以看到,生命周期没有完全运行,所以可以说它跳过阶段 2 -5:在恢复视图阶段之后,直接调用渲染响应阶段。我错过了应用值、验证、更新模型操作等。

所以,这可能是先有鸡还是先有蛋的问题: 1.负责的阶段没有被调用,所以新的表单输入不能结转。 2.系统不识别任何新的输入,因此在恢复视图后直接渲染。

我检查了没有调用 responseComplete() 或 renderResponse()。

我不知何故被卡住了。有什么想法可以验证这两个假设之一吗?或者一般如何调试?有没有人遇到过类似的问题?


更新

我怀疑 JSF 不知道 回发请求 并像处理 初始视图 一样处理它。这可以解释,我只通过了第 1 和第 6 阶段。

如果 JSF 将其识别为 non-faces-request,我该如何检查?
如何检查当前facesContext 中是否有适当的treeID

【问题讨论】:

    标签: jsf skip phase


    【解决方案1】:

    我引用了我在before 发布的答案:

    每当UICommand 组件 未能调用相关操作, 验证以下内容:

    1. UICommand 组件必须放在 UIForm 组件内 (例如h:form)。
    2. 您不能将多个 UIForm 组件嵌套 (注意包含文件!)。
    3. 应该没有发生验证/转换错误(使用 h:messages 全部获取)。
    4. 如果UICommand 组件放置在UIData 组件内, 确保完全相同 DataModel(后面的对象 UIDatavalue 属性)是 保存。
    5. 组件的rendereddisabled 属性以及所有 父组件不应该 在应用期间评估为false 请求值阶段。
    6. 确保没有PhaseListener 或任何EventListener 在 请求-响应链改变了 跳过调用的 JSF 生命周期 行动阶段。
    7. 确保在同一请求-响应中没有 FilterServlet 链已阻止请求 FacesServlet 不知何故。

    由于在您的特定情况下跳过了阶段 2-5,并且您确定(?)FacesContext#renderResponse() 未被调用,因此可以从列表中删除原因 3、6 和 7。原因 4 和 5 也可能会被忽略,这取决于您调试 JSF 阶段的方式。调查其他原因。我在原因 2 上的美分。检查您是否在生成的 HTML 源代码中看不到 <form><form></form></form> 并在 JSF 源代码中回溯。

    【讨论】:

    • 谢谢,我会检查的。仍然欢迎其他想法:-)
    • 首先告知您是否已排除所有内容。
    • 我检查了一切。应用程序本身似乎不是错误,但通常是服务器/JSF/配置。我不知道,那里可能坏了。
    • 你在 JSF 页面的任何地方都使用binding 属性吗?如果是这样,您是否确保他们每个人都指向自己的财产(因此不共享对方的财产)?
    • 绑定的唯一外观如下: 很抱歉,但我不明白问题出在哪里。
    【解决方案2】:

    找到了解决方案! 很抱歉,但我猜它是非常特定于应用程序的:JSF 的自定义 StateManager 不适用于 JSF 1.2。这导致了这个奇怪的错误。 修复了 StateManager,一切正常。这很痛苦,而且花费了很多时间:-(

    无论如何感谢您的帮助:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2020-05-29
      相关资源
      最近更新 更多