【问题标题】:How to access enum properties in EL?如何访问 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

标签: jsf enums el jsf-2.2


【解决方案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" 是正确的命名空间
  • 并且需要在类路径中添加扩展名:stackoverflow.com/a/16017210/1915920github.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 中,该链接已失效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多