如何在EL中访问枚举属性?

时间:2014-04-17 03:02:02

标签: jsf enums el jsf-2.2

鉴于以下enum

public enum Constants
{
    PAGE_LINKS(10);
    //Other constants as and when required.

    private final int value;

    private Constants(int value){
        this.value = value;
    }

    public int getValue(){
        value;
    }    
}

这个enum放在应用程序范围的bean下面,如此,

@ManagedBean
@ApplicationScoped
public final class ConstantsBean
{
    private Constants constants;

    public ConstantsBean() {}

    public Constants getConstants() {
        return constants;
    }
}

如何在EL中访问PAGE_LINKS的值?

<p:dataGrid pageLinks="#{}".../>

#{}应该写什么?有可能吗?


修改

按以下方式修改bean,

@ManagedBean
@ApplicationScoped
public final class ConstantsBean
{
    public ConstantsBean() {}

    public int getValue(Constants constants) {
        return constants.getValue();
    }
}

然后像这样访问EL,

<p:dataGrid pageLinks="#{constantsBean.getValue('PAGE_LINKS')}".../>

某种程度上有效,但我不相信这种丑陋的方式。

2 个答案:

答案 0 :(得分:17)

这是Sazzadur的commented

#{constantsBean.constants.value}

应该有效。你的枚举对value属性有适当的公共吸气剂。但是,您还应确保将托管bean的constants属性设置为所需的枚举值。您在目前为止发布的代码段中没有这样做,因此它仍然是null。当(基础)属性为null时,EL设计不会打印任何内容。

以下是设置方法:

@ManagedBean
@ApplicationScoped
public final class ConstantsBean {
    private Constants constants = Constants.PAGE_LINKS;

    public Constants getConstants() {
        return constants;
    }
}

然而,我将属性(和getter)重命名为pageLinks以获得更好的自我可记录性。

#{constantsBean.pageLinks.value}

另一种方法是使用OmniFaces <o:importConstants>,根据您的问题历史,您已经熟悉OmniFaces,并且可能已经在您当前的项目中使用它。

<o:importConstants type="com.example.Constants" />
...
#{Constants.PAGE_LINKS.value}

这样您就不需要将事物包装在应用程序范围的bean中。

答案 1 :(得分:7)

从Primefaces 6.0开始,你也可以使用PrimeFaces importEnum(在导入之前是“Primefaces Extensions”)。

https://www.primefaces.org/showcase/ui/misc/importEnum.xhtml