Spring Boot 2.4.2 和 Thymeleaf 3.0.12 - 访问静态方法

Posted

技术标签:

【中文标题】Spring Boot 2.4.2 和 Thymeleaf 3.0.12 - 访问静态方法【英文标题】:Spring Boot 2.4.2 and Thymeleaf 3.0.12 - access static methods 【发布时间】:2021-05-08 21:37:46 【问题描述】:

自从我切换到 Spring Boot 2.4.2 后,我的 Thymeleaf 模板已损坏。当我想访问 Spring Controller 中的静态成员时,出现以下错误:

异常处理模板“template_name”:新实例化 在这种情况下禁止对象和访问静态类。

代码如下: th:text="$T(com.test).testMethod("1234")"

你有什么建议来解决这个问题吗?

【问题讨论】:

【参考方案1】:

另一个快速解决方法是使用 th:with

th:text="$testText"
th:with="testText=$T(com.test).testMethod("1234")"

来源/荣誉:https://github.com/thymeleaf/thymeleaf/issues/816#issuecomment-791921248 和 https://github.com/thymeleaf/thymeleaf/issues/816#issuecomment-826401631

【讨论】:

【参考方案2】:

有一种解决方法可以使用在 Spring 应用程序上下文中注册的带有 @beanName 语法的 bean 方法。像这样:

<div th:text="$@testService.testMethod('123')">...</div>

http://www.thymeleaf.org/doc/articles/springmvcaccessdata.html

【讨论】:

【参考方案3】:

此更改是Thymeleaf 3.0.12 的一部分。他们improve restricted expression evaluation mode security 通过限制访问静态代码(OGNL 中的@identifier@,SpringEL 中的 T(identifier))。他们自己做了什么? ...“避免实例化新对象和调用静态类”,如发行说明中所述。您可以将 JAVA 调用移动到您的控制器中并将结果放入视图模型中。在从 Thymeleaf 模板访问这个变量之后。

【讨论】:

感谢您的意见!我在域模型中移动了静态方法,这在视图模型中也是已知的。 还将所有静态方法替换为非静态方法。

以上是关于Spring Boot 2.4.2 和 Thymeleaf 3.0.12 - 访问静态方法的主要内容,如果未能解决你的问题,请参考以下文章

开源框架thyme-boot使用

Thymeleaf 模板 在spring boot 中的引用和应用

Spring Boot Mobile不使用移动模板

Spring Boot + JPA + Thymeleaf + Hibernate应用了多个验证注释

Spring Boot 2.4.2 和 Thymeleaf 3.0.12 - 访问静态方法

Spring Boot 2.4.2 网关 API 与 Zuul