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

Tin*_*iny 13 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;
    }    
}
Run Code Online (Sandbox Code Playgroud)

enum被置于应用程序范围的bean下,如此,

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

    public ConstantsBean() {}

    public Constants getConstants() {
        return constants;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何访问PAGE_LINKSEL中的值?

<p:dataGrid pageLinks="#{}".../>
Run Code Online (Sandbox Code Playgroud)

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


编辑:

以下列方式修改bean,

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

    public int getValue(Constants constants) {
        return constants.getValue();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样访问EL,

<p:dataGrid pageLinks="#{constantsBean.getValue('PAGE_LINKS')}".../>
Run Code Online (Sandbox Code Playgroud)

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

Bal*_*usC 17

正如Sazzadur 评论的那样,

#{constantsBean.constants.value}
Run Code Online (Sandbox Code Playgroud)

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

以下是您可以设置它的方法:

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

    public Constants getConstants() {
        return constants;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

#{constantsBean.pageLinks.value}
Run Code Online (Sandbox Code Playgroud)

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

<o:importConstants type="com.example.Constants" />
...
#{Constants.PAGE_LINKS.value}
Run Code Online (Sandbox Code Playgroud)

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


tan*_*hko 8

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

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