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

Smo*_*lda 9 jsf el

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

看看这个例子:

<h:outputText id="#{bean.id}" value="#{bean.value}" />
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalArgumentException: Empty id attribute is not allowed
Run Code Online (Sandbox Code Playgroud)

当我查看生成的HTML输出时,组件的ID为空.这是怎么造成的,我该如何解决?

Bal*_*usC 19

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

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

<h:dataTable value="#{someBean.beans}" var="bean">
    <h:column>
        <h:outputText id="#{bean.id}" value="#{bean.value}" />
Run Code Online (Sandbox Code Playgroud)

在视图构建时,即需要组合JSF组件树的那一刻,评估JSF组件的id(和binding)属性.但是,#{bean}仅在视图呈现时间期间可用,此时<h:dataTable>需要迭代所有对象并为每个对象生成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}" />
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用纯HTML元素:

    <h:dataTable value="#{someBean.beans}" var="bean">
        <h:column>
            <span id="#{bean.id}">#{bean.value}</span>
    
    Run Code Online (Sandbox Code Playgroud)
  3. 不要设置动态ID,而是设置固定ID.JSF将通过在表格的行索引前加上它来确保HTML输出的唯一性:

    <h:dataTable value="#{someBean.beans}" var="bean">
        <h:column>
            <h:outputText id="id" value="#{bean.value}" />
    
    Run Code Online (Sandbox Code Playgroud)

也可以看看: