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

问题描述 投票:13回答: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')}".../>

不知何故有效,但我不相信这种丑陋的方式。

jsf enums el jsf-2.2
2个回答
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中。


7
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.