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

Posted

技术标签:

【中文标题】如何访问 EL 中的枚举属性?【英文标题】:How to access enum properties in EL? 【发布时间】:2014-06-01 04:13:02 【问题描述】:

鉴于以下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')".../>

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

【问题讨论】:

#constantsBean.constants.value 应该适合你。 那行不通,@SazzadurRahaman 【参考方案1】:

这个,作为 Sazzadur 的commented,

#constantsBean.constants.value

应该可以。您的枚举为其value 属性提供了适当的公共吸气剂。但是,您还应该确保将托管 bean 的 constants 属性设置为所需的枚举值。您在到目前为止发布的代码 sn-p 中没有这样做,因此它仍然是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 &lt;o:importConstants&gt;,根据您的问题历史,您已经熟悉 OmniFaces,并且可能已经在您当前的项目中使用它。

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

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

【讨论】:

&lt;o:importConstants&gt; 找不到给定的类型。我跟着this 回答并移动了Constants 类(实际上是enum /WEB-INF/classes/util/Constants.java /src/java/util/Constants.java。 IDE 显示“不正确的包”。这个标签(在&lt;h:form&gt; 内),&lt;o:importConstants var="const" type="util.Constants"/&gt; 抛出 java.lang.IllegalArgumentException: Cannot find type 'util.Constants' in classpath. 我缺少什么明显的东西? 您使用的是什么 IDE?它应该自动从/src 编译.java 文件并将创建的.class 文件放入/WEB-INF/classes。您永远不需要在/WEB-INF/classes 中手动摆弄。也许您不小心关闭了自动构建? 它是 NetBeans IDE 8.0。我所做的是:从服务器(GlassFish 4.0)取消部署应用程序,重新启动服务器,clean and build 然后从头开始重新部署应用程序,但之后仍然存在相同的异常。所有 Java 包都存储在/src/java 下。 Constants 类也存在于/src/java/util/Constants.java 中,它位于构建文件夹 - /build/web/WEB-INF/classes/util/Constants.class。然后它应该自动可供已部署的WAR 使用。 这是应用程序部署后Constants.class(一个enum)的完整路径-E:\Project\JavaEE\Project\Project-war\build\web\WEB-INF\classes\util\Constants.class 排除一个和另一个,实际答案对你有用吗?【参考方案2】:

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

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

【讨论】:

因为上面的例子中没有提到:xmlns:pe="http://primefaces.org/ui/extensions" 是正确的命名空间 并且需要在类路径中添加扩展名:***.com/a/16017210/1915920 和 github.com/primefaces-extensions/… 不幸的是,在 Eclipse Kepler 中使用 JBoss Tools 的代码补全不起作用,我发现没有支持它的 Eclipse 插件。但没有什么是完美的 :-) 对我来说,它仍然比编写 @Name enum Foo xxx, bar ; public static String getXxx() return xxx.name(); ... getter 并将枚举暴露给客户端(使用它ala #foo.xxx)更好。 自 6.1 起 importEnum 已合并到 PF 中,该链接已失效

以上是关于如何访问 EL 中的枚举属性?的主要内容,如果未能解决你的问题,请参考以下文章

在 JSTL/EL 中,枚举到字符串的比较究竟应该如何工作?

JSP中的EL

使用带有 JSTL 的 EL 访问枚举值

我如何访问枚举中的变量

如何使用 AutoMapper 将 json 请求 dto 中的 OData 枚举字符串映射到实体枚举属性

EL表达式