【问题标题】:Finding the cause of: "The form component needs to have a UIForm in its ancestry."查找原因:“表单组件需要在其祖先中有一个 UIForm。”
【发布时间】:2016-11-17 14:45:42
【问题描述】:

有什么方法可以确定是哪一行(甚至是什么文件)导致了

表单组件需要在其祖先中有一个 UIForm。建议:将必要的组件包含在

来自 Primefaces 的警告信息?我刚刚开始处理一个已建立的项目,其中包含许多具有各种模板和继承的 .xhtml 文件(由其他人编写),但我无法缩小导致问题的文件范围。

我试过谷歌搜索但没有成功,但我在 SO 上找不到解决如何找到错误来源的答案。

更新:不是去url中显示的页面那么简单。例如,当我导航到'../foo.xhtml' 时会显示警告,但是foo.xhtml 实现了一个模板并包含多个其他.xhtml 文件(每个文件又包含几个.xhtml 文件)。所有文件都相当大(至少 500 行)。

【问题讨论】:

  • 应该清楚哪一页吧?既然你在一个页面中得到了这个(或者这个服务器正在记录?)尝试增加日志级别?
  • @Kukeltje 实际上没有。我会更新问题。
  • 另外,它不会在任何地方注销,它只是在页面加载时显示的 primefaces 咆哮消息。
  • 所以你知道它是什么页面。然后开始减少你的页面。它是如此简单。删除模板等。这就是找到原因的方法。不应超过 5 分钟。
  • @Kukeltje - 不是当有多个模板和包含语句时。并且几乎不可能开始注释页面,因为对其他包含文件的引用会导致异常。

标签: jsf primefaces


【解决方案1】:

if 块内的FormOmittedChecker#check() 中放置一个调试断点,其中isInNeedOfForm(component) 已返回true,在Mojarra 2.2.12 中为line 99

   96                    if (isForm(component)) {
   97                        result = VisitResult.REJECT;
   98                    } else if (isInNeedOfForm(component)) {
*  99                        addFormOmittedMessage(finalContext);
  100                    }

给定一个页面,其输入字段没有<h:form>

<h:inputText id="someInputText" />

断点命中在 Eclipse 中如下所示:

正如您在屏幕截图中看到的,您可以检查变量堆栈中的component 变量,然后检查其clientId(或id)属性。最后,您可以在生成的 HTML 输出和/或 JSF 源代码中找到并关联它。

不过,我同意该消息应包含更好的诊断信息。根据issue 4026,此问题已在 Mojarra 2.3.0-m04 中修复。

【讨论】:

  • 感谢您的回复!我会尽快尝试的。
  • 工作就像一个魅力!我希望我能做的不仅仅是支持和接受。非常感谢!
  • 不客气。您可以考虑开始赏金并让它运行一整周。
猜你喜欢
  • 2016-07-14
  • 2011-12-06
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
相关资源
最近更新 更多