Pergunta

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.

Foi útil?

Solução

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.

Outras dicas

Since Primefaces 6.0 you can also use PrimeFaces importEnum (Before that import was in "Primefaces Extensions").

https://www.primefaces.org/showcase/ui/misc/importEnum.xhtml

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top