【问题标题】:Binding attribute causes duplicate component ID found in the view绑定属性导致在视图中发现重复的组件 ID
【发布时间】:2017-05-08 21:19:59
【问题描述】:

这里是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 错误。错误消息说 &lt;h:inputText&gt; 没有唯一 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属性?

【问题讨论】:

    标签: jsf binding duplicates components


    【解决方案1】:

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

    • 相同的 ID 用于同一 NamingContainer 内的不同组件。
    • 物理上不同的组件绑定到同一个 bean 的相同属性。
    • &lt;f:subview&gt; 是在包含页面而不是父页面中声明的。
    • 同一个包含页面多次包含在同一个NamingContainer中。
    • 组件是在没有明确分配 ID 的情况下动态创建的。

    这里,NamingContainer 是 &lt;h:form&gt;、&lt;h:dataTable&gt; 和 &lt;f:subview&gt; 等。

    当使用binding 时,您应该将它绑定到一个属性,该属性由相关组件在每个请求的基础上独家使用。您的具体情况表明此绑定由多个组件共享,可能跨越不同的请求。当您将组件绑定到支持 bean 的属性时,支持 bean 绝对不应处于比请求范围更广泛的范围内。另请参阅JSF 2.0 specitication 第 3.1.5 章(重点是我的):

    3.1.5 组件绑定

    ...

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

    另见:

    【讨论】:

    • 支持 bean 具有会话范围。该 bean 仅由该组件使用。你说的“独家”是什么意思?
    • 因此同一会话中的不同请求/视图共享相同的绑定?这并不总是有效。将它放在请求范围的 bean 中。
    • 我将完全避免绑定并找到合适的解决方法。但我只是想知道它是正常的绑定行为(即来自规范)吗?使用标准 jsf 组件会得到相同的结果吗?还是视情况而定?
    • 嗯?只需放入请求范围并进一步使用它。您甚至可以使其成为会话范围 bean 的子项。另一个原因也可能是组件在包含/组合文件中使用,并且在同一页面内多次包含/重用。
    • 感谢您列出可能存在的问题。它的第二项让我了解到 getLineChartComponent() 方法应该返回 null(在我的情况下,它不会破坏任何功能,我对 setter 方法感兴趣)。
    【解决方案2】:

    我遇到了同样的问题,直到找到这个避免重复组件 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>
    

    【讨论】:

      猜你喜欢
      • 2013-12-30
      • 2015-12-02
      • 2021-09-10
      • 2017-05-20
      • 1970-01-01
      • 2023-04-07
      • 2021-06-19
      相关资源
      最近更新 更多