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

17

考虑以下的 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;
    }    
}

这个枚举被放置在一个应用程序作用域的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')}".../>

某种程度上这个方法可行,不过我不相信这种丑陋的方式。


1
#{constantsBean.constants.value} 应该适用于您。 - Sazzadur Rahaman
那不起作用, @SazzadurRahaman - Tiny
2个回答

20

根据Sazzadur的评论,此处为:

#{constantsBean.constants.value}

应该可以工作。您的枚举类型有一个适当的公共 getter 方法,用于其 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中。


<o:importConstants> 无法找到给定的类型。我按照这个答案,将 Constants 类(实际上是枚举) /src/java/util/Constants.java 移动到 /WEB-INF/classes/util/Constants.java。IDE 显示 "错误的包名”。在 <h:form> 标签内的这个标签 <o:importConstants var="const" type="util.Constants"/> 抛出了 java.lang.IllegalArgumentException: Cannot find type 'util.Constants' in classpath. 我错过了什么明显的吗? - Tiny
你使用的是哪个集成开发环境(IDE)?它应该自动编译 /src 目录下的 .java 文件,并将生成的 .class 文件放在 /WEB-INF/classes 目录下。你不应该手动操作 /WEB-INF/classes 目录。也许你不小心关闭了自动构建功能? - BalusC
这是NetBeans IDE 8.0。我的操作是:从服务器(GlassFish 4.0)中取消部署应用程序,重新启动服务器,执行清理和构建,然后从头开始重新部署应用程序,但是仍然出现相同的异常。所有Java包都存储在/src/java下。Constants类也在/src/java/util/Constants.java中,并且在构建文件夹/build/web/WEB-INF/classes/util/Constants.class中可用。它应该自动对部署的WAR可用。 - Tiny
这是应用程序部署后 Constants.class(一个 enum)的完整路径 - E:\Project\JavaEE\Project\Project-war\build\web\WEB-INF\classes\util\Constants.class - Tiny
排除其中一个和另一个,实际答案对你有用吗? - BalusC
显示剩余9条评论

10

由于上面的示例中没有提到:xmlns:pe="http://primefaces.org/ui/extensions"是应该包括的正确名称空间。 - Andreas Covidiot
你需要将扩展名添加到类路径中:https://dev59.com/jXDYa4cB1Zd3GeqPF_T7#16017210 和 https://github.com/primefaces-extensions/primefaces-extensions.github.com/wiki/Getting-Started#other-users - Andreas Covidiot
很不幸,Eclipse Kepler与JBoss Tools中的代码自动补全功能无法正常运行,我也没有找到支持它的Eclipse插件。但是,世上并非完美无缺 :-) ,对我而言,这仍然比编写“@Name enum Foo { xxx, bar ; public static String getXxx() { return xxx.name(); } ... }”获取器并将枚举暴露给客户端(使用类似“#{foo.xxx}”的方式)要好得多。 - Andreas Covidiot
链接已失效,因为importEnum已经在PF 6.1中被合并。 - Jeremy Rea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接