如何在f:selectItems中为枚举创建和使用通用bean?

时间:2012-07-17 18:53:59

标签: java jsf generics enums managed-bean

我有这个签名的通用类:

public abstract class EnumListBean<E extends Enum<E>> {

    public List<E> getEnumList() {
        //implementation details
    }

}

目前我必须定义一个空子类才能访问具体泛型参数的enumList属性:

@ManagedBean
@ApplicationScoped
public class ItemRarityBean  extends EnumListBean<Item.Rarity>{
}

这样就可以访问该属性,例如:

<f:selectItems value="#{itemRarityBean.enumList}" var="rarity"
            itemLabel="#{rarity.readableName}" itemValue="#{rarity}" />

我想知道是否真的必须声明一个派生bean但是不能直接将泛型类作为bean访问:

<f:selectItems value="#{enumListBean<Item.Rarity>.enumList}" var="rarity"
                itemLabel="#{rarity.readableName}" itemValue="#{rarity}" />

2 个答案:

答案 0 :(得分:4)

您不能在EL中使用泛型。 EL是一种基于反射的运行时语言。您知道,泛型仅在编译期间可用,而不是在运行时期间。

出于特定目的,使用OmniFaces <o:importConstants>可能更容易。

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

var属性不是强制性的,但您需要将其引用为#{Item$Rarity},这不完全可读;如果您的Rarity枚举是独立的枚举而不是内部枚举,那么你可以使用type="com.example.Rarity"

它的设计被视为Map<String, Rarity>,而不是List<Rarity>左右。因此,如果您打算访问var的{​​{1}}属性中的各个项目,以便您可以访问特定的枚举方法,那么您需要显式迭代<f:selectItems>(这将需要EL 2.2支持。)

Map#values()

答案 1 :(得分:2)

是的,你必须这样做。因为实例化抽象类是没有意义的。