是否可以在JSF中测试枚举相等性?
E.g。其中stuff
是enum Stuff
:
<h:outputText value="text" rendered="#{mrBean.stuff == mrsBean.stuff}"/>
答案 0 :(得分:93)
这实际上比JSF相关的EL更多。您发布的构造是有效的,但您应该记住,EL 2.1中的枚举值实际上被评估为String
值。如果String.valueOf(mrBean.getStuff())
等于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}" />
答案 1 :(得分: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
枚举并失败。
答案 2 :(得分: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}"/>