使用 id="#{...}"导致 java.lang.IllegalArgumentException:不允许空 id 属性

发布于 2024-11-27 03:41:32 字数 307 浏览 0 评论 0 原文

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

看一下这个示例:

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

我的问题是我收到此错误:

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

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

I need to solve my problem with generating dynamic ID for some components in JSF.

Have a look at this example:

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

My problem is that I am getting this error:

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

The ID of the component is empty when I look at generated HTML output. How is this caused and how can I solve it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

美羊羊 2024-12-04 03:41:33

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

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

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

: JSF 组件的 code>id(和 binding)属性在视图构建期间(即需要组合 JSF 组件树的时刻)进行评估。但是,#{bean} 仅在视图渲染期间可用,即 需要迭代所有对象并生成 HTML 表格行的时刻他们每个人。因此,#{bean} 在视图构建期间不可用,并且计算结果为 null,最终被 EL 强制转换为空字符串。因此会出现异常 java.lang.IllegalArgumentException: Empty id attribute is not allowed

您基本上有 3 个选项:

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

    <前><代码><表>;


  2. 使用纯 HTML 元素:

    
        
            #{bean.value}
    
  3. 不要设置动态 ID,而是设置固定 ID。 JSF 将通过在 HTML 输出前面添加表的行索引来确保 HTML 输出的唯一性:

    
        
            
    

另请参阅:

You are right. I am using it inside datatable.

Then this can happen if the #{bean} represents the currently iterated object as declared in var attribute like so:

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

The id (and binding) attribute of a JSF component is evaluated during view build time, that moment when the JSF component tree needs to be composed. However, the #{bean} is only available during view render time, that moment when <h:dataTable> needs to iterate over all objects and generate HTML table rows for each of them. The #{bean} is thus not available during view build time and evaluates to null which ultimately gets EL-coerced to an empty string. And hence the exception java.lang.IllegalArgumentException: Empty id attribute is not allowed.

You've basically 3 options:

  1. Use a view build time tag instead to iterate over a collection. You'd only need to write all HTML boilerplate yourself:

    <table>
        <c:forEach items="#{someBean.beans}" var="bean">
            <tr>
                <td>
                    <h:outputText id="#{bean.id}" value="#{bean.value}" />
    
  2. Use a plain HTML element:

    <h:dataTable value="#{someBean.beans}" var="bean">
        <h:column>
            <span id="#{bean.id}">#{bean.value}</span>
    
  3. Don't set a dynamic ID, but a fixed ID. JSF will ensure of uniqueness in HTML output by prepending it with row index of the table:

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

See also:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文