web-dev-qa-db-ja.com

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;
    }
}

ELでPAGE_LINKSの値にアクセスするにはどうすればよいですか?

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

#{}には何を書くべきですか?出来ますか?


編集:

次の方法で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')}".../>

どういうわけか動作しますが、私はこの醜い方法を信じていません。

14
Tiny

これは、 コメント Sazzadurによって、

#{constantsBean.constants.value}

動作するはずです。列挙型には、そのvalueプロパティ用の適切なパブリックゲッターがあります。ただし、マネージドBeanのconstantsプロパティを目的の列挙値に設定していることも確認する必要があります。つまり、これまでに投稿されたコードスニペットではそれを行わなかったため、nullのままです。 ELは、(ベース)プロパティがnullの場合、設計上何も出力しません。

設定方法は次のとおりです。

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

    public Constants getConstants() {
        return constants;
    }
}

ただし、自己文書化を向上させるために、プロパティ(およびゲッター)の名前をpageLinksに変更します。

#{constantsBean.pageLinks.value}

別の方法は、 OmniFaces <o:importConstants> 、質問の履歴に基づいて、OmniFacesに既に精通しており、おそらく現在のプロジェクトでもすでに使用しています。

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

このように、アプリケーションスコープのBeanでThingをラップする必要はありません。

18
BalusC

Primefaces 6.0以降、PrimeFaces importEnumを使用することもできます(以前はインポートは「PrimefacesExtensions」で行われました)。

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

8
tandraschko