ユーザーのログイン時に sessionScope オブジェクトを設定していますが、その Bean オブジェクトはいくつかの他の Bean で構成されています。これらの Bean のプロパティの 1 つは列挙型でしたが、EL は列挙型クラスのプロパティを取得できず、Java Bean オブジェクトのプロパティしか取得できないことがわかりました。そこで、列挙型の Bean クラスを作成し、その Bean クラスに列挙型をネストすることにしました。ELで値を取得できるように列挙型を置き換えるために作成したJava Beanは、次のようになります。
public class RankBean implements Serializable {
private static final long serialVersionUID = -1;
private String rankName;
public RankBean(String rankName) {
this.rankName= rankName;
}
public RankBean(Rank rank) {
this.rankName = rank.getRankName();
}
public String getRankName() {
return rankName;
}
public void setRankName(String rankName) {
this.rankName = rankName;
}
public static enum Rank {
RANK_1("some rank name"),
RANK_2("some rank name"),
RANK_3("some rank name"),
RANK_4("some rank name"),
RANK_5("some rank name"),
RANK_6("some rank name"),
RANK_7("some rank name"),
RANK_8("some rank name");
private String rankName;
private Rank(String rankName) {
this.rankName = rankName;
}
public String getRankName() {
return rankName;
}
public static Rank getRank(String rankName) {
for (Rank rank : Rank.values()) {
if (rank.getRankName().equals(rankName)) {
return rank;
}
}
return null;
}
@Override
public String toString() {
return rankName;
}
}
}
ただし、ランク名 (または存在する可能性があるプロパティ) にアクセスしようとすると、ランク オブジェクトが文字列であり、rankName という名前のプロパティが java.lang.String に存在しないという JSP エラーが引き続き発生します。これは、列挙型のプロパティを直接取得しようとしたときに発生したのと同じ問題ですが、今はそうではありません。エラーメッセージは次のとおりです。
javax.el.PropertyNotFoundException: Property 'rankName' not found on type java.lang.String
したがって、rankName が明らかに存在しないため、次の EL はエラーを引き起こします。
${sessionScope.account.player.rank}