JSF2 <h:message>无法找到ID为</h:message>的组件

时间:2012-03-08 20:52:30

标签: jsf-2

我正在使用&lt; ui:repeat&gt;构建一个表格标签,它的长度是动态的。每行都有一个&lt; h:inputText&gt;领域。提交表单时,它会将表单中的值设置为散列映射。除了验证之外,一切都很好。我需要告诉&lt; h:message&gt;它使用“for”属性输入哪个输入。我已经尝试根据用于创建行的项目的名称,每行创建一个唯一的ID。但是&lt; h:message&gt;提交无效输入时,tag仍然为空,我在服务器日志(JBoss 7.1)上得到以下输出:

[javax.enterprise.resource.webcontainer.jsf.renderkit]
Unable to find component with ID nTAS in view.

这是XHTML:

<ui:repeat var="item" ...>
...
<h:inputText value="#{bean.chosenItems[item.name]}" id="n#{item.name}" >
    <f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="n#{item.name}" />
...
</ui:repeat>

为了至少在浏览器中收到某种错误消息,我还在页面顶部添加了这个消息,并且它可以正常工作:

<h:messages styleClass="error" />

显示以下消息:

j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type.

这种情况表明问题的一部分,因为ID是消息开头的奇怪代码,它以“n”开头,但不包含项目的名称。如果我在浏览器中查看源代码,则ID实际为:id="j_idt13:j_idt17:1:nTAS"

如果我查看表格之外的其他组件,它们也有神秘的ID,显然是由JSF生成的。

真正奇怪的是,当我第二次输入“asdf”并重新提交表单时,它会在bean上调用action方法,而不是在验证阶段再次失败!怎么会这样?!

感谢任何提示, 约翰

1 个答案:

答案 0 :(得分:5)

您无法使用el表达式动态创建ID。如果你没有为组件分配ID,那么“神秘”的ID确实是由jsf生成的。

但您不需要在ui:repeat中关注您的ID的唯一性。 JSF为您完成(生成的id字符串中的“1”是重复组件的计数器)。只需为输入字段指定一个“固定”ID,并在h:message中引用它:

<h:inputText value="#{bean.chosenItems[item.name]}" id="myID" >
    <f:validateLongRange minimum="0" maximum="10" />
</h:inputText>
<h:message for="myID" />