Search code examples
jsfenumsel

How to testing for enum equality in JSF?


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}"/>

Solution

  • This is actually more EL related than Faces related. The construct as you posted is valid, but you should keep in mind that enum values are in EL 2.1 or older 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 or newer 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 EL, you cannot access enum values directly like this:

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

    This is only possible when you use Faces 2.3-introduced <f:importConstants> tag:

    <f:metadata>
        <f:importConstants type="com.example.Stuff" />
    </f:metadata>
    ...
    <h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
    

    Or when you're not on Faces 2.3 yet or when you don't want to use <f:metadata>, use the OmniFaces predecesor <o:importConstants>:

    <o:importConstants type="com.example.Stuff" />
    ...
    <h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />