How to testing for enum equality in JSF?

2019-01-22 01:21发布

Is it possible to test for enum equality in JSF?

E.g. where stuff is an enum Stuff:

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

标签: jsf enums el
3条回答
倾城 Initia
2楼-- · 2019-01-22 01:47

If you have the enum

public enum Status {
    YES, NO
}

you can reference the enums in your jsf pages like so:

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

I'm not so sure about the String evaluation, due to something I stumbled upon while refactoring some code to use enums: if you have a typo in your status String, ie:

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

you will actually get a runtime error when you hit the page because the EL parser will try to coerce 'YESSIR' into a Status enum and fail.

查看更多
做自己的国王
3楼-- · 2019-01-22 01:57

You could define testing methods on the enum, see the following source.

Enum definition:

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

JSF code:

<h:outputText value="text" rendered="#{mrBean.stuff ne null and mrBean.stuff.foo}"/>
查看更多
放荡不羁爱自由
4楼-- · 2019-01-22 02:04

This is actually more EL related than JSF related. The construct as you posted is valid, but you should keep in mind that enum values are in EL 2.1 are actually evaluated as String values. If String.valueOf(mrBean.getStuff()) equals String.valueOf(mrsBean.getStuff()), then your code example will render. In EL 2.2 the same construct will work, but they are evaluated as true enums.

Note that it indeed requires a getter method to return the enum value. Given the fact that enums are treated as String, you can in essence also just do:

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

In current EL 2.2 version, you cannot access enum values directly like this:

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

This is only possible when you use OmniFaces <o:importConstants>:

<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
查看更多
登录 后发表回答