mike-neckのブログ

Java or Groovy or Swift or Golang

【メモ】JSFでenumのオブジェクトをselectOneMenuに使う方法

なんかドはまりしていたのでメモ。


固定された値を入力するプルダウンを作るのだけど、値そのものが単純なものなので、enumで済ませたい場合の方法。

enum

enum Sex {
    WOMAN, MAN
}

バッキングビーン

@Named("editStudent")
@RequestScoped
public class EditStudent {
    private Sex sex;

    public List<Sex> getSexes() {
        return Arrays.asList(Sex.values());
    }
//getter,
}

xhtml

<h:selectOneMenu value="#{editStudent.sex}" required="true" label="#{msg.common_sex}">
    <f:selectItems value="#{editStudent.sexes}" var="s" itemValue="#{s}" itemLabel="#{s}"/>
</h:selectOneMenu>

ところで、固定値などのラベルはtoString()ではなくて、ちゃんとした文字列かつ国際化できるようにしておきたい。そこでリソースの値を取得できるようにしておく。

enum

enum Sex {
    WOMAN("common_sex_woman"), MAN("common_sex_man");
    private final String resId;
    Sex(String resId) {this.resId = resId;}
    public String getResId() {return resId;}
}

message.properties

common_sex_woman=女子
common_sex_man=男子

xhtml

<h:selectOneMenu value="#{editStudent.sex}" required="true" label="#{msg.common_sex}">
    <f:selectItems value="#{editStudent.sexes}" var="s" itemValue="#{s}" itemLabel="#{msg[s.resId]}"/>
</h:selectOneMenu>

これで国際化も対応したプルダウンをenumから作成できる。


ちなみに僕がはまってたのは既存のデータを更新するときに値をセットし忘れてデフォルトで前の登録内容が反映されていないというポカミスでした。

おわり