JSF2 <h:message>无法找到具有ID的组件

Joh*_*ith 2 jsf-2

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

[javax.enterprise.resource.webcontainer.jsf.renderkit]
Unable to find component with ID nTAS in view.
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

为了至少在浏览器中获得某种错误消息,我还在页面顶部附近添加了这个消息,它的工作原理如下:

<h:messages styleClass="error" />
Run Code Online (Sandbox Code Playgroud)

它显示以下消息:

j_idt13:j_idt17:1:n: Validation Error: Value is not of the correct type.
Run Code Online (Sandbox Code Playgroud)

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

如果我查看表之外的其他组件,它们也有隐藏ID,显然是由JSF生成的.

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

谢谢任何提示,约翰

Mat*_*ndy 5

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

但是你不需要关心你的id的独特性ui:repeat.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" />
Run Code Online (Sandbox Code Playgroud)