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

Jsf 如何访问EL中的枚举属性?,jsf,enums,el,jsf-2.2,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; } }

给定以下
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中访问
页面链接的值

<p:dataGrid pageLinks="#{}".../>
然后像这样进入EL

<p:dataGrid pageLinks="#{constantsBean.getValue('PAGE_LINKS')}".../>

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

正如萨扎杜尔所说

#{constantsBean.constants.value}
应该有用。枚举的
属性具有适当的公共getter。但是,您还应该确保将托管bean的
常量
属性设置为所需的枚举值。您在目前发布的代码片段中没有这样做,因此它仍然是
null
。当(base)属性为
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,并且可能已经在当前项目中使用了OmniFaces

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

...
#{Constants.PAGE_LINKS.value}

这样,您就不需要将东西包装到应用程序范围的bean中。

由于Primefaces 6.0,您也可以使用Primefaces
importEnum
(导入之前是在“Primefaces Extensions”中)


{constantsBean.constants.value}
应该适合您。如果不行,@Sazzadurahaman
找不到给定的类型。我按照答案,将
常量
类(
enum
实际上)从
/src/java/util/Constants.java
移动到
/WEB-INF/classes/util/Constants.java
。IDE显示“不正确的包”。此标记(位于
内部),
抛出
java.lang.IllegalArgumentException:在类路径中找不到类型“util.Constants”。
我缺少什么明显的内容?您使用的是什么IDE?它应该从
/src
自动编译
.java
文件,并将创建的
.class
文件放入
/WEB-INF/classes
中。您不应该需要在
/WEB-INF/classes
中手动摆弄。也许您不小心关闭了自动生成?它是NetBeans IDE 8.0。我所做的是:从服务器上取消部署应用程序(GlassFish 4.0),重新启动服务器,进行清理和构建,然后从头开始重新部署应用程序,但之后仍然存在相同的异常。所有Java包都存储在
/src/Java
下。
Constants
类也位于
/src/java/util/Constants.java
中,它位于build文件夹-
/build/web/web-INF/classes/util/Constants.class
中。这是应用程序部署后
常量.class
(一个
enum
)的完整路径-
E:\Project\JavaEE\Project\Project-WAR\build\web\web-INF\classes\util\Constants.class
排除其中一个和另一个,实际答案对您有用吗?因为上面的示例中没有提到:
xmlns:pe=”http://primefaces.org/ui/extensions"
是合适的名称空间,您需要将扩展添加到类路径:不幸的是,使用JBoss工具在Eclipse Kepler中完成代码不起作用,我发现没有Eclipse插件支持它。但是没有什么是完美的:-)对我来说,它仍然比编写
@Name enum Foo{xxx,bar;公共静态字符串getXxx(){return xxx.Name()}…}
getters并向客户机公开enum(使用它ala
{Foo.xxx}
)要好。自从importEnum从6.1开始被合并到PF中以来,这个链接就死了
<o:importConstants type="com.example.Constants" />
...
#{Constants.PAGE_LINKS.value}