这是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
属性?
答案 0 :(得分:33)
在以下情况下可能会发生重复的组件ID错误:
NamingContainer
内的不同组件。<f:subview>
。NamingContainer
内多次包含。此处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>