绑定属性会导致在视图中find重复的组件ID
这里是JSF代码:
<h:inputText binding="#{bean.input}" />
这里是一个支持bean绑定支持的一部分:
private HtmlInputText input; public void setInput(HtmlInputText input) { this.input = input; } public HtmlInputText getInput() { return this.input; }
当我第一次打开页面时,一切正常,但当我第二次打开它(刷新或打开在另一个选项卡或任何其他方式相同的URL)时,我得到重复的ID错误。 错误消息说, <h:inputText>
没有唯一的ID。 这是一个长的错误信息的一部分:
java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view +id: inputId type: javax.faces.component.html.HtmlInputText@cafebabe
添加binding
属性后发生问题。 如果我删除它,一切将再次正常工作。 我如何正确使用binding
属性?
在以下情况下可能会出现重复的组件ID错误:
- 同一个
NamingContainer
不同组件使用相同的ID。 - 物理上不同的组件绑定到同一个bean的同一个属性。
- 在包含页面中声明了
<f:subview>
而不是父页面。 - 相同的包含页面在同一个
NamingContainer
内包含多次。 - 一个组件是dynamic创build的,没有分配一个明确的ID。
在这里, NamingContainer
包括<h:form>
, <h:dataTable>
和<f:subview>
。
使用binding
,应该将其绑定到每个请求基础上由有问题的组件专门使用的属性。 您的具体情况表明,此绑定已被多个组件共享,也许跨越不同的请求。 当你将组件绑定到一个支持bean的属性时,那么支持bean应该绝对不在比请求范围更广的范围内。 另请参阅JSF 2.0 specitication第3.1.5章(重点介绍):
3.1.5组件绑定
…
组件绑定通常与通过Managed Bean Creation工具dynamic实例化的JavaBean结合使用(请参见第5.8.1节“VariableResolver和Default VariableResolver”)。 强烈build议应用程序开发人员将组件绑定expression式指向的“托pipebean”放在“请求”范围内。 这是因为将它放在会话或应用程序范围内将需要线程安全性,因为UIComponent实例依赖于在单个线程内运行。 将组件绑定放置在“会话”范围内时,也会对内存pipe理产生潜在的负面影响。
也可以看看:
- “绑定”属性在JSF中如何工作? 何时以及如何使用?
- 如何在JSF中使用组件绑定的权利? (会话作用域bean中的请求作用域组件)
- 查看范围:java.io.NotSerializableException:javax.faces.component.html.HtmlInputText