52

是否可以在 JSF 中测试枚举相等性?

例如,哪里stuffenum Stuff

<h:outputText value="text" rendered="#{mrBean.stuff == mrsBean.stuff}"/>
4

3 回答 3

98

这实际上与 EL 相关,而不是与 JSF 相关。您发布的构造是有效的,但您应该记住,EL 2.1 中的枚举值实际上被评估为String值。如果String.valueOf(mrBean.getStuff())equals String.valueOf(mrsBean.getStuff()),那么您的代码示例将呈现。在 EL 2.2 中,相同的构造将起作用,但它们被评估为真正的枚举。

请注意,它确实需要一个 getter 方法来返回枚举值。鉴于枚举被视为String,您本质上也可以这样做:

<h:outputText value="text" rendered="#{mrBean.stuff == 'FOO'}" />

在当前的 EL 2.2 版本中,您不能像这样直接访问枚举值:

<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />

这只有在您使用OmniFaces<o:importConstants>时才有可能:

<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
于 2010-03-26T16:28:35.847 回答
37

如果你有枚举

public enum Status {
    YES, NO
}

您可以像这样在 jsf 页面中引用枚举:

<h:outputText value="text" rendered="#{myBean.status == 'YES'}"/>

我不太确定字符串评估,因为我在重构一些代码以使用枚举时偶然发现了一些东西:如果你的状态字符串中有错字,即:

<h:outputText value="text" rendered="#{myBean.status == 'YESSIR'}"/>

当您点击页面时,您实际上会遇到运行时错误,因为 EL 解析器会尝试将“YESSIR”强制转换为Status枚举并失败。

于 2010-03-26T21:00:59.577 回答
2

您可以在枚举上定义测试方法,请参阅以下来源。

枚举定义:

public enum MyEnum {
    FOO;
    public boolean isFoo(){
        return FOO.equals(this);
    }
}

JSF 代码:

<h:outputText value="text" rendered="#{mrBean.stuff ne null and mrBean.stuff.foo}"/>
于 2015-06-09T15:14:19.213 回答