JSFで列挙型の等価性をテストすることは可能ですか?
例えば。ここで、stuff
はenum Stuff
:
<h:outputText value="text" rendered="#{mrBean.stuff == mrsBean.stuff}"/>
これは、実際にはJSF関連よりもEL関連です。投稿した構造は有効ですが、EL 2.1の列挙値は実際にString
値として評価されることに注意してください。 String.valueOf(mrBean.getStuff())
がString.valueOf(mrsBean.getStuff())
と等しい場合、コード例がレンダリングされます。 EL 2.2でも同じ構造が機能しますが、真の列挙として評価されます。
実際には、列挙値を返すにはゲッターメソッドが必要です。列挙型がString
として扱われるという事実を考えると、本質的には次のこともできます。
<h:outputText value="text" rendered="#{mrBean.stuff == 'FOO'}" />
現在のEL 2.2バージョンでは、cannot次のように列挙値に直接アクセスできます。
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
これは OmniFaces <o:importConstants>
:
<o:importConstants type="com.example.Stuff" />
...
<h:outputText value="text" rendered="#{mrBean.stuff == Stuff.FOO}" />
列挙型がある場合
public enum Status {
YES, NO
}
次のようにjsfページで列挙型を参照できます。
<h:outputText value="text" rendered="#{myBean.status == 'YES'}"/>
列挙を使用するためにいくつかのコードをリファクタリングしているときにつまずいたことが原因で、文字列の評価についてはよくわかりません。ステータス文字列にタイプミスがある場合、つまり:
<h:outputText value="text" rendered="#{myBean.status == 'YESSIR'}"/>
eLパーサーは 'YESSIR'をStatus
列挙型に強制して失敗させるため、ページをヒットすると実際にランタイムエラーが発生します。
Enumでテストメソッドを定義できます。次のソースを参照してください。
列挙型の定義:
public enum MyEnum {
FOO;
public boolean isFoo(){
return FOO.equals(this);
}
}
JSFコード:
<h:outputText value="text" rendered="#{mrBean.stuff ne null and mrBean.stuff.foo}"/>