绑定属性会导致在视图中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