我正在尝试将应用程序从 2.2.6 升级到 Spring Boot 3.0.6,虽然我已经解决了很多问题,但 Thymeleaf 问题导致了问题。
我之前已经按照 Baeldung 教程 实现了一系列基于枚举的复选框来存储用户偏好。在升级之前,它工作正常 - 相关代码的精简版本是:
public enum MyEnum {
SOME(true, OtherClass.class),
VALUES(true, OtherClass.class),
FOR(true, OtherClass.class),
THE(false, AnotherClass.class),
ENUM(false, AnotherClass.class);
//constructor, so on
private boolean configurable;
private Class<?> relatedClass;
}
//lombok
@Data
public class FormDTO {
private List<MyEnum> myField;
}
<input type="checkbox" th:each="item : ${T(my.app.MyEnum).values()}"
th:if="${item.configurable == true and item.relatedClass == T(my.app.OtherClass)}"
name="myField" th:value="${item}" th:checked="${#lists.contains(selectedItems, item)}" />
迭代仍然有效——第一个 SpEL 表达式比较相关类也是如此。但是,
#lists.contains()
现在评估为 false
,将其交换为 selectedItems.contains(item)
也是如此 - 但是,如果在将其添加到模板之前,selectedItems.contains(item)
在应用程序中的其他任何地方运行,则评估为 true
。
此外,添加
MyEnum.values()
作为模型属性而不是使用 SpEL 访问它返回 true
为 #lists.contains()
- 但随后 item.relatedClass == T(my.app.OtherClass)
检查返回 false
无论如何。
我已经能够通过添加将 myField
值映射到
List<String>
的实用方法来使 something工作,这样我就可以修改
th:checked
以有效地成为 #lists.contains(myField.getEnumNames(), item.name)
但这似乎是次优的解决方案 - 是否有人对 Thymeleaf 3 中枚举的处理是否/如何发生变化有任何指示,这可能会导致这种行为变化?