【发布时间】:2022-12-31 21:58:48
【问题描述】:
我刚刚将 Web 项目升级到 Spring 6、Spring Boot 3 GA,现在我处理以下 Thymeleaf 不兼容问题。我正在生成表单选择。
<select class="form-select" th:field="*{bankAccountId}" th:classappend="${#fields.hasErrors('bankAccountId')} ? 'is-invalid'">
<option value="" th:text="#{SelectBankAccount}">SELECT_BANK_ACCOUNT</option>
<option th:each="bankAccount : ${bankAccounts}" th:value="${bankAccount.getId()}" th:text="${bankAccount.getName()}" th:selected="${bankAccount.getId().equals(bankAccountId)}">BANK_ACCOUNT_NAME</option>
</select>
th:selected 中的表达式失败,出现以下异常。
org.springframework.expression.EvaluationException: Calling method 'equals' is forbidden for type 'class java.util.UUID' in Thymeleaf expressions. Blocked classes are: [com.sun.*, jakarta.*, java.*, javax.*, jdk.*, org.ietf.jgss.*, org.omg.*, org.w3c.dom.*, org.xml.sax.*, sun.*]. Allowed classes are: [java.lang.Boolean, java.lang.Byte, java.lang.Character, java.lang.Double, java.lang.Enum, java.lang.Float, java.lang.Integer, java.lang.Iterable, java.lang.Long, java.lang.Math, java.lang.Number, java.lang.Short, java.lang.String, java.math.BigDecimal, java.math.BigInteger, java.math.RoundingMode, java.time.*, java.util.ArrayList, java.util.Calendar, java.util.Calendar, java.util.Collection, java.util.Date, java.util.Enumeration, java.util.HashMap, java.util.HashSet, java.util.Iterator, java.util.LinkedHashMap, java.util.LinkedHashSet, java.util.LinkedList, java.util.List, java.util.Locale, java.util.Map, java.util.Map$Entry, java.util.Optional, java.util.Properties, java.util.Set, java.util.stream.Stream].
at org.thymeleaf.spring6.expression.ThymeleafEvaluationContext$ThymeleafEvaluationContextACLMethodResolver.resolve(ThymeleafEvaluationContext.java:282) ~[thymeleaf-spring6-3.1.0.RELEASE.jar:3.1.0.RELEASE]
bankAccount.getId() 和$bankAccountId 都是java.util.UUID。
在 Thymeleaf 表达式中无法转换为 String。禁止对 java.util 包对象的所有方法调用。
不确定什么是最正确的解决方法。我可以将 UUID 转换为 backAccount 对象中的字符串,将比较器方法添加到 backAccount 中,静态调用比较器实用程序或通过 @bean 表示法,甚至为 Thymeleaf 定义自定义方法并用作 #xxx() 表达式。
【问题讨论】:
标签: spring spring-boot spring-mvc thymeleaf spring-thymeleaf