列挙型Constants
があります:
enum Constants {
ONE,TWO,THREE;
}
Thymeleafの列挙型定数を比較するにはどうすればよいですか。
ありがとう。
列挙定数と比較するには、次のコードを使用します。
th:if="${day == T(my.package.MyEnum).MONDAY}"
もう1つの方法:
th:if="${constant.name() == 'ONE'}"
短いですが、文字列表現と比較して、リファクタリング中に問題を引き起こす可能性があります。
@Nickの答えには小さな構文エラーがあり、最後の括弧がありません。そのはず
th:if="${day == T(my.package.MyEnum).MONDAY}"
th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">
別のオプションは、スイッチで列挙のメソッド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でスイッチするのと似ています。
これを試して :
th:if="${ day.toString() == 'MONDAY'}"
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}"
を使用できます。
Enumをオブジェクト内の文字列に変換したくない場合は、次のようにできます。
th:if="${#strings.defaultString(someObject.myConstant, 'DEFAULT_VALUE') == 'ONE'}"
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()
を呼び出して完全修飾名をテンプレートに直接書き込むよりもタイプセーフです。このソリューションを使用すると、テンプレートをテストせずにリファクタリングできます。