在 Thymeleaf 3 (Spring Boot 3) 中使用枚举

问题描述 投票:0回答:0

我正在尝试将应用程序从 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 中枚举的处理是否/如何发生变化有任何指示,这可能会导致这种行为变化?

spring-boot enums thymeleaf spring-el
© www.soinside.com 2019 - 2024. All rights reserved.