使用 id="#{...}"导致 java.lang.IllegalArgumentException:不允许空 id 属性
我需要解决为 JSF 中的某些组件生成动态 ID 的问题。
看一下这个示例:
<h:outputText id="#{bean.id}" value="#{bean.value}" />
我的问题是我收到此错误:
java.lang.IllegalArgumentException: Empty id attribute is not allowed
当我查看生成的 HTML 输出时,组件的 ID 为空。这是如何引起的以及如何解决?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果
#{bean}
表示当前迭代的对象(如var
属性中声明的那样),则可能会发生这种情况: JSF 组件的 code>id(和
binding
)属性在视图构建期间(即需要组合 JSF 组件树的时刻)进行评估。但是,#{bean}
仅在视图渲染期间可用,即
需要迭代所有对象并生成 HTML 表格行的时刻他们每个人。因此,#{bean}
在视图构建期间不可用,并且计算结果为null
,最终被 EL 强制转换为空字符串。因此会出现异常java.lang.IllegalArgumentException: Empty id attribute is not allowed
。您基本上有 3 个选项:
使用视图构建时间标记来迭代集合。您只需要自己编写所有 HTML 样板:
<前><代码><表>;
使用纯 HTML 元素:
不要设置动态 ID,而是设置固定 ID。 JSF 将通过在 HTML 输出前面添加表的行索引来确保 HTML 输出的唯一性:
另请参阅:
Then this can happen if the
#{bean}
represents the currently iterated object as declared invar
attribute like so:The
id
(andbinding
) 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 tonull
which ultimately gets EL-coerced to an empty string. And hence the exceptionjava.lang.IllegalArgumentException: Empty id attribute is not allowed
.You've basically 3 options:
Use a view build time tag instead to iterate over a collection. You'd only need to write all HTML boilerplate yourself:
Use a plain HTML element:
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:
See also: