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

Rom*_*man 13 jsf binding components duplicates

这是JSF代码:

<h:inputText binding="#{bean.input}" />
Run Code Online (Sandbox Code Playgroud)

这里是支持bean的一部分用于绑定支持:

private HtmlInputText input;

public void setInput(HtmlInputText input) {
    this.input = input;
}

public HtmlInputText getInput() {
    return this.input;
}
Run Code Online (Sandbox Code Playgroud)

当我第一次打开页面时一切正常但是当我第二次打开它时(刷新或在另一个选项卡中打开相同的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
Run Code Online (Sandbox Code Playgroud)

添加binding属性后出现问题.如果我删除它,一切都会再次正常工作.我如何正确使用binding属性?

Bal*_*usC 34

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

  • 相同的ID用于内部的不同组件NamingContainer.
  • 物理上不同的组件绑定到同一个bean的相同属性.
  • <f:subview>在包括网页,而不是父页面被宣布.
  • 相同的包含页面在同一内容中多次包含NamingContainer.
  • 在没有分配显式ID的情况下动态创建组件.

在这里,NamingContainer其中包括<h:form>,<h:dataTable><f:subview>.

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

3.1.5组件绑定

...

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

也可以看看:

  • 咦?只需输入请求范围并进一步使用它.您甚至可以将其作为会话范围bean的子项.另一个原因还可能是组件已在包含/组合文件中使用,并且在同一页面内多次包含/重用该组件. (2认同)

归档时间:

查看次数:

16500 次

最近记录:

7 年,2 月 前