Подтвердить что ты не робот

Как получить доступ к свойствам enum в EL?

Учитывая следующее 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;
    }    
}

Этот enum помещается под областью приложения bean, например,

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

    public ConstantsBean() {}

    public Constants getConstants() {
        return constants;
    }
}

Как получить доступ к значению PAGE_LINKS в EL?

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

Что должно быть написано в #{}? Возможно ли это?


EDIT:

Изменив bean следующим образом,

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

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

а затем доступ в EL так,

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

как-то работает, но я не верю в этот уродливый способ.

4b9b3361

Ответ 1

Это, как прокомментировал Саззадур,

#{constantsBean.constants.value}

должен работать. Свойство enum имеет правильный публичный getter для своего свойства value. Однако вы также должны убедиться, что вы установили свойство constants управляемого bean в желаемое значение перечисления. Вы не сделали этого в фрагменте кода, опубликованном до сих пор, и, таким образом, он остается null. EL по дизайну ничего не печатает, если свойство (base) null.

Здесь вы можете установить его:

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

    public Constants getConstants() {
        return constants;
    }
}

Я бы переименовал свойство (и getter) на pageLinks для лучшей самодокупимости.

#{constantsBean.pageLinks.value}

Альтернативой является использование OmniFaces <o:importConstants>, основанный на вашей истории вопроса, вы уже знакомы с OmniFaces и, вероятно, уже используете его в вашем текущем проекте.

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

Таким образом, вам не нужно обертывать эту вещь в области приложения bean.