How to create and use a generic bean for enums in f:selectItems?
enums, generics, java, jsf, managed-bean
Solution
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>
Problem
I have generic class with this signature: ``` public abstract class EnumListBean<E extends Enum<E>> { public List<E> getEnumList() { //implementation details } } ``` Currently I have to define a empty subclass in order to access the enumList property for a concrete generic parameter: ``` @ManagedBean @ApplicationScoped public class ItemRarityBean extends EnumListBean<Item.Rarity>{ } ``` This makes its possible to access the property e.g: ``` <f:selectItems value="#{itemRarityBean.enumList}" var="rarity" itemLabel="#{rarity.readableName}" itemValue="#{rarity}" /> ``` Im wondering whether one really have to declare a deriving bean but cant access the generic class as bean directly: ``` <f:selectItems value="#{enumListBean<Item.Rarity>.enumList}" var="rarity" itemLabel="#{rarity.readableName}" itemValue="#{rarity}" /> ```