迭代 <o:importConstants> 导入的枚举值

Iterate over enum values imported by <o:importConstants>

是否可以在 ui:repeatc:forEach 中迭代 ENUM? 我正在使用 Omnifaces 2.5 的 o:importConstants

示例代码:

<o:importConstants type="my.package.MyEnum"></o:importConstants>
<c:forEach var="icon" items="#{MyEnum}">
    #{icon.toString()}
</c:forEach>

但它来了:

com.sun.faces.facelets.tag.jstl.core.MappedValueExpression$Entry@565a5787

com.sun.faces.facelets.tag.jstl.core.MappedValueExpression$Entry@6c01f0ce

com.sun.faces.facelets.tag.jstl.core.MappedValueExpression$Entry@2cd6ac37

com.sun.faces.facelets.tag.jstl.core.MappedValueExpression$Entry@7b6d8d37

com.sun.faces.facelets.tag.jstl.core.MappedValueExpression$Entry@7f8f1bb2

<o:importConstants> 将枚举值转换为 Map<String, E>,其中映射键是枚举名称的字符串表示,映射值是实际的枚举实例本身。您现在实质上正在尝试的是打印每个 Map.Entry instance as string. You should actually be using its getKey() and/or getValue() 方法。

目前仅 <c:forEach> 支持直接迭代 Map。另见 How to use jstl foreach directly over the values of a map?

<c:forEach items="#{MyEnum}" var="entry">
    Map key: #{entry.key} <br/>
    Map value: #{entry.value} <br/>
</c:forEach>

<ui:repeat>(和<h:dataTable>)仅从 JSF 2.3 开始支持它。在那之前,您最好迭代 Map#values()

<ui:repeat value="#{MyEnum.values()}" var="value">
    Map value: #{value} <br/>
</ui:repeat>