【问题标题】:Using id="#{...}" causes java.lang.IllegalArgumentException: Empty id attribute is not allowed使用 id="#{...}" 导致 java.lang.IllegalArgumentException: Empty id attribute is not allowed
【发布时间】:2011-10-16 14:54:53
【问题描述】:

我需要解决我在 JSF 中为某些组件生成动态 ID 的问题。

看看这个例子:

<h:outputText id="#{bean.id}" value="#{bean.value}" />

我的问题是我收到了这个错误:

java.lang.IllegalArgumentException: Empty id attribute is not allowed

当我查看生成的 HTML 输出时,组件的 ID 为空。这是如何引起的,我该如何解决?

【问题讨论】:

  • 是的,我确定。它来自数据库的唯一 ID。
  • 你是对的。我在数据表中使用它。有什么解决办法吗?

标签: jsf el


【解决方案1】:

你是对的。我在数据表中使用它。

如果#{bean} 代表var 属性中声明的当前迭代对象,则可能发生这种情况:

<h:dataTable value="#{someBean.beans}" var="bean">
    <h:column>
        <h:outputText id="#{bean.id}" value="#{bean.value}" />

JSF 组件的id(和binding)属性在视图构建时进行评估,此时需要组合JSF 组件树。但是,#{bean} 仅在视图渲染期间可用,此时&lt;h:dataTable&gt; 需要遍历所有对象并为每个对象生成 HTML 表格行。因此,#{bean} 在视图构建期间不可用,并评估为null,最终将 EL 强制转换为空字符串。因此 java.lang.IllegalArgumentException: Empty id attribute is not allowed 例外。

你基本上有 3 个选择:

  1. 使用视图构建时间标记来迭代集合。您只需要自己编写所有 HTML 样板:

    <table>
        <c:forEach items="#{someBean.beans}" var="bean">
            <tr>
                <td>
                    <h:outputText id="#{bean.id}" value="#{bean.value}" />
    
  2. 使用纯 HTML 元素:

    <h:dataTable value="#{someBean.beans}" var="bean">
        <h:column>
            <span id="#{bean.id}">#{bean.value}</span>
    
  3. 不要设置动态 ID,而是设置固定 ID。 JSF 将通过在 HTML 输出中添加表的行索引来确保其唯一性:

    <h:dataTable value="#{someBean.beans}" var="bean">
        <h:column>
            <h:outputText id="id" value="#{bean.value}" />
    

另见:

【讨论】:

  • 感谢您的回答。我的想法是,我希望为每个列连接来自 primefaces 的工具提示,这需要连接 ID。
  • BalusC:您从来不需要动态 ID?如果没有动态 ID,您将如何在 JSF 页面上多次使用可重用的 facelet 标记/组件?
  • @bch:给它一个固定的 ID。例如。 &lt;my:tag id="foo"&gt;&lt;h:some id="#{id}"&gt;。或者让它成为一个复合组件。
  • 你用 的建议救了我的命!谢谢你:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-29
  • 2021-11-03
  • 2018-02-18
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多