How to create and use a generic bean for enums in f:selectItems?

人走茶凉 提交于 2019-11-29 11:50:01

You can't use generics in EL. EL is a runtime language based on reflection. You know, generics is only available during compiletime, not during runtime.

For your particular purpose, it's likely easier to use OmniFaces <o:importConstants>.

<o:importConstants type="com.example.Item$Rarity" var="Rarity" />
...
<h:selectOneMenu>
    <f:selectItems value="#{Rarity}" />
</h:selectOneMenu>

(the var attribute is not mandatory, but you'd otherwise need to reference it as #{Item$Rarity} which is not exactly nicely readable; if your Rarity enum were a standalone enum and not an inner enum, then you could just use type="com.example.Rarity")

It's by design treated as a Map<String, Rarity>, not a List<Rarity> or so. So if you intend to access the individual items in the var attribute of <f:selectItems>, so that you can access specific enum methods, then you'd need to explicitly iterate over Map#values() (which would require EL 2.2 support).

<h:selectOneMenu>
    <f:selectItems value="#{Rarity.values()}" var="rarity" itemValue="#{rarity}" itemLabel="#{rarity.readableName}" />
</h:selectOneMenu>

Yes, you have to. Because instantiating abstract classes makes no sense.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!