
在 Thymeleaf 模板中调用 Java 静态方法时,若误用 T() 语法(如 T(java.lang.Math).random()),会因 OGNL 解析异常导致 source is null for getProperty(null, "lang") 错误;正确方式应使用 @类名@静态方法() 语法。
在 thymeleaf 模板中调用 java 静态方法时,若误用 `t()` 语法(如 `t(java.lang.math).random()`),会因 ognl 解析异常导致 `source is null for getproperty(null, "lang")` 错误;正确方式应使用 `@类名@静态方法()` 语法。
Thymeleaf 默认使用 OGNL(Object-Graph Navigation Language)作为表达式引擎(尤其在较老版本或未显式配置为 SpringEL 的场景下),而 T() 是 Spring Expression Language(SpEL)的语法,并不被原生 OGNL 支持。当你写成:
<code class="html"><div th:text="${T(java.lang.Math).random()}"></div></code>
OGNL 尝试将 T(java.lang.Math) 解析为一个对象属性访问(例如误认为 T 是当前上下文对象的一个名为 T 的属性),进而触发对 null.lang 的非法访问,最终抛出 OgnlException: source is null for getProperty(null, "lang") —— 这正是错误栈中反复出现的根本原因。
✅ 正确写法(OGNL 兼容):
使用 @全限定类名@静态方法() 语法,Thymeleaf 的 OGNL 表达式求值器可直接识别并调用:
<code class="html"><div th:text="${@java.lang.Math@random()}">随机数</div></code>
该语法明确告知 OGNL:这是一个静态方法调用,无需实例上下文,避免了属性解析歧义。
⚠️ 注意事项:
- 此语法仅适用于 Thymeleaf 3.0+(且未强制切换至 SpEL 模式);若项目已集成 Spring Boot 并启用
spring-thymeleafstarter,默认仍使用 OGNL,除非显式配置spring.thymeleaf.expression-language=spel。 -
@...@中的类名必须是全限定名(含包路径),且该类需在应用 classpath 中可访问(java.lang.*类默认可用)。 - 不支持带参数的泛型类型(如
@java.util.Collections@singletonList(1)在部分 OGNL 版本中可能受限),但Math.random()这类无参静态方法完全安全。 - 若你希望统一使用 SpEL(从而支持
T()语法),需确保 Thymeleaf 配置为 SpEL 模式,并引入spring-web依赖;此时可写作:<code class="html"><div th:text="${T(java.lang.Math).random()}"></div> <!-- ✅ SpEL 下有效 --></code>
? 总结:
遇到 OgnlException: source is null for getProperty(null, "lang"),大概率是误用了 SpEL 语法于 OGNL 环境。优先检查模板表达式引擎类型,并改用 @全限定类名@方法名() 格式调用静态方法——简洁、兼容、零配置生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











