web-dev-qa-db-ja.com

thymeleafの列挙型定数の比較

列挙型Constantsがあります:

enum Constants {
    ONE,TWO,THREE;
}

Thymeleafの列挙型定数を比較するにはどうすればよいですか。

ありがとう。

36
user3128455

列挙定数と比較するには、次のコードを使用します。

th:if="${day == T(my.package.MyEnum).MONDAY}"
73
Nick

もう1つの方法:

th:if="${constant.name() == 'ONE'}"

短いですが、文字列表現と比較して、リファクタリング中に問題を引き起こす可能性があります。

34
TachikomaGT

@Nickの答えには小さな構文エラーがあり、最後の括弧がありません。そのはず

th:if="${day == T(my.package.MyEnum).MONDAY}"
7
th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">
6
user3128455

別のオプションは、スイッチで列挙のメソッドname()を使用することです。例は次のとおりです。

_  <th:block th:switch="${imageType.name()}>
     <span th:case="'ONE'"></span>
     <span th:case="'TWO'"></span>
     <span th:case="'THREE'"></span>
  </th:block>
_

Java非常に奇妙に見える${day == T(my.package.MyEnum).MONDAY}${#strings.toString(someObject.constantEnumString) == 'ONE'}のような他の回答の代わりにENUMでスイッチするのと似ています。

5
Pau

これを試して :

th:if="${ day.toString() == 'MONDAY'}"
2
Dilip Dalwadi

isXXX()メソッドを列挙型に追加する傾向があります。

enum Constants {
    ONE,TWO,THREE;
    public boolean isOne() { return this == ONE; }
    public boolean isTwo() { return this == TWO; }
    public boolean isThree() { return this == THREE; }
}

次に、valueが列挙型のインスタンスである場合、th:if="${value.one}"を使用できます。

1
megaflop

Enumをオブジェクト内の文字列に変換したくない場合は、次のようにできます。

th:if="${#strings.defaultString(someObject.myConstant, 'DEFAULT_VALUE') == 'ONE'}"
1
Vegard

Enumのラッパーを使用することをお勧めします。

_public class ConstantsWrapper {
    public static final instance = new ConstantsWrapper();
    public Constants getONE() { return Constants.ONE }
    public Constants getTWO() { return Constants.TWO }
    public Constants getTHREE() { return Constants.THREE }
} 
_

次のステップは、Wrapperの新しいインスタンスをモデルに追加することです

_models.add("constantsWrapper", ConstantsWrapper.instance);
_

これで、thymeleafテンプレートでConstantsの各値に型安全にアクセスできます。

_th:if="${value == constantsWrapper.getONE()}"
_

このソリューションでは、より多くのソースコードを記述し、1つのインスタンスを作成する必要があることを知っています。 Advantageは、T()を呼び出して完全修飾名をテンプレートに直接書き込むよりもタイプセーフです。このソリューションを使用すると、テンプレートをテストせずにリファクタリングできます。

0
LuiGi