如何访问 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 <o:importConstants>
,根据您的问题历史,您已经熟悉 OmniFaces,并且可能已经在您当前的项目中使用它。
<o:importConstants type="com.example.Constants" />
...
#Constants.PAGE_LINKS.value
这样您就不需要将事物包装在应用程序范围的 bean 中。
【讨论】:
<o:importConstants>
找不到给定的类型。我跟着this 回答并移动了Constants
类(实际上是enum
)到 /WEB-INF/classes/util/Constants.java
从 /src/java/util/Constants.java
。 IDE 显示“不正确的包”。这个标签(在<h:form>
内),<o:importConstants var="const" type="util.Constants"/>
抛出 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 中,枚举到字符串的比较究竟应该如何工作?