绑定属性导致在视图中找到重复的组件ID

时间:2010-01-20 13:49:54

标签: jsf binding duplicates components

这是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属性?

2 个答案:

答案 0 :(得分:33)

在以下情况下可能会发生重复的组件ID错误:

  • 相同的ID用于同一NamingContainer内的不同组件。
  • 物理上不同的组件绑定到同一个bean的相同属性。
  • 已在包含页面而不是父页面中声明<f:subview>
  • 同一个包含页面在同一NamingContainer内多次包含。
  • 动态创建了一个组件,但未指定明确的ID。

此处NamingContainer包括<h:form><h:dataTable><f:subview>

使用binding时,您应该将其绑定到一个属性,该属性由每个请求的相关组件完全使用。您的特定情况表明此绑定已由多个组件共享,可能跨越不同的请求。将组件绑定到辅助bean的属性时,支持bean绝对不应该在比请求范围更广的范围内。另见JSF 2.0 specitication第3.1.5章(强调我的):

  

3.1.5组件绑定

     

...

     

组件绑定通常与通过Managed Bean Creation工具动态实例化的JavaBeans一起使用(请参见第5.8.1节“VariableResolver和Default VariableResolver”)。 强烈建议应用程序开发人员在“请求”范围内放置由组件绑定表达式指向的托管bean。这是因为将其置于会话或应用程序范围内需要线程安全,因为UIComponent实例取决于在单个线程内部运行。在“会话”范围内放置组件绑定时,对内存管理也可能产生负面影响。

另见:

答案 1 :(得分:0)

我遇到了同样的问题,直到发现这个标签出现了重复的组件ID

<f:subview id="top">
    <p:outputPanel id="panelHeader1"  
        binding="#{circularRequestBean.panelHeader}" autoUpdate="true"
        class="col-md-12 col-sm-12 col-xs-12 col-lg-12 wihtoutPadding"
        style="padding:0px; !important; display:block;" />

</f:subview>