我有一个枚举,Constants
:
enum Constants {
ONE,TWO,THREE;
}
如何比较Thymeleaf中的枚举常量。
感谢。
答案 0 :(得分:73)
要与枚举常量进行比较,请使用以下代码:
th:if="${day == T(my.package.MyEnum).MONDAY}"
答案 1 :(得分:29)
还有一种方法:
th:if="${constant.name() == 'ONE'}"
它更短但与字符串表示进行比较,在重构时可能会导致问题。
答案 2 :(得分:7)
@Nick的答案有一个小的语法错误,它缺少最后一个大括号。它应该是
th:if="${day == T(my.package.MyEnum).MONDAY}"
答案 3 :(得分:6)
th:if="${#strings.toString(someObject.constantEnumString) == 'ONE'}">
答案 4 :(得分:4)
另一种选择是在交换机中使用枚举的方法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 Switch swith ENUM,而不是像${day == T(my.package.MyEnum).MONDAY}
或${#strings.toString(someObject.constantEnumString) == 'ONE'}
这样的其他答案,看起来很奇怪。
答案 5 :(得分:2)
试试这个:
th:if="${ day.toString() == 'MONDAY'}"
答案 6 :(得分:1)
如果您不想将Enum转换为对象中的字符串,可以这样做:
th:if="${#strings.defaultString(someObject.myConstant, 'DEFAULT_VALUE') == 'ONE'}"
答案 7 :(得分:1)
我倾向于在我的枚举中添加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}"
。
答案 8 :(得分:0)
我更喜欢在枚举周围使用包装器。
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);
现在,您可以在百万美元模板中对Constants
的每个值进行类型安全访问。
th:if="${value == constantsWrapper.getONE()}"
我知道这个解决方案需要编写更多源代码并创建一个实例。
Advantage比调用T()
更安全,并将完全限定名称直接写入模板。使用此解决方案,您无需测试模板即可进行重构。
答案 9 :(得分:0)
示例1:
nullptr
解决方案:
enum Constants {
ONE,
TWO,
THREE;
}
注意:为了安全起见,您可以使用th:if="${string == T(com.example.Constants).ONE}"
OR
th:if="${string == T(com.example.Constants).ONE.toString()}"
。
示例2:
.toString()
解决方案:
enum Constants {
ONE("One"),
TWO("Two"),
THREE("Three");
}
注意:当您的枚举有Description时,您必须使用th:if="${string == T(com.example.Constants).ONE.toString()}"
。
示例3:
.toString()
解决方案:
enum Constants {
ONE("One"),
TWO("Two"),
THREE("Three");
}
注意:th:if="${'One' == T(com.example.Constants).ONE.getName()}"
进行的枚举描述调用。
答案 10 :(得分:0)
正如其他答案所提到的,'T()' 方法允许访问枚举的成员,但它需要完整的包路径名,这可能很长。这有点麻烦,特别是如果枚举需要被多次引用。使用 'th:with' 使其更具可读性和可维护性。
<div th:with="MyEnum=${T(my.package.MyEnum)}">
<div th:if="${day == MyEnum.MONDAY}">
<span>Happy Monday!</span>
</div>
<div th:if="${day == MyEnum.FRIDAY}">
<span>TGIF!</span>
</div>
</div>