How to access enum properties in EL?

Tiny picture Tiny · Apr 17, 2014 · Viewed 16.3k times · Source

Given the following 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;
    }    
}

This enum is placed under an application scoped bean like so,

@ManagedBean
@ApplicationScoped
public final class ConstantsBean
{
    private Constants constants;

    public ConstantsBean() {}

    public Constants getConstants() {
        return constants;
    }
}

How to access the value of PAGE_LINKS in EL?

<p:dataGrid pageLinks="#{}".../>

What should be written in #{}? Is it possible?


EDIT:

Modifying the bean in the following way,

@ManagedBean
@ApplicationScoped
public final class ConstantsBean
{
    public ConstantsBean() {}

    public int getValue(Constants constants) {
        return constants.getValue();
    }
}

and then accessing in EL like so,

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

somehow works but I don't believe in this ugly way.

Answer

BalusC picture BalusC · Apr 25, 2014

This, as commented by Sazzadur,

#{constantsBean.constants.value}

should work. Your enum has a proper public getter for its value property. However, you should also make sure that you set the constants property of the managed bean to the desired enum value. You namely didn't do that in the code snippet posted so far and thus it remains null. EL does by design not print anything when a (base) property is null.

Here's how you could set it:

@ManagedBean
@ApplicationScoped
public final class ConstantsBean {
    private Constants constants = Constants.PAGE_LINKS;

    public Constants getConstants() {
        return constants;
    }
}

I'd however rename the property (and getter) to pageLinks for better self-documentability.

#{constantsBean.pageLinks.value}

An alternative is to use OmniFaces <o:importConstants>, based on your question history you're already familiar with OmniFaces and probably also already using it in your current project.

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

This way you don't need to wrap the thing in an application scoped bean.