You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Thymeleaf调用Math#random静态方法触发OgnlException异常求助

Thymeleaf调用Java静态方法抛出OgnlException问题解决

问题描述

尝试在Thymeleaf中调用Java静态方法,代码如下:

<div th:text="${T(java.lang.Math).random()}"/>

运行后始终抛出异常:OgnlException: source is null for getProperty(null, "lang"),完整错误信息如下:

2023-08-11 16:17:16,221 ERROR [etp1561005241-55] o.t.TemplateEngine [THYMELEAF][etp1561005241-55] Exception processing template "test.html": Exception evaluating OGNL expression: "T(java.lang.Math).random(
)" (template: "test.html" - line 89, col 14)
org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating OGNL expression: "T(java.lang.Math).random()" (template: "diag-ui.html" - line 89, col 14)
        at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:199)
        at org.thymeleaf.standard.expression.OGNLVariableExpressionEvaluator.evaluate(OGNLVariableExpressionEvaluator.java:104)
        at org.thymeleaf.standard.expression.VariableExpression.executeVariableExpression(VariableExpression.java:166)
        at org.thymeleaf.standard.expression.SimpleExpression.executeSimple(SimpleExpression.java:66)
        at org.thymeleaf.standard.expression.Expression.execute(Expression.java:109)
        at org.thymeleaf.standard.expression.Expression.execute(Expression.java:138)
        at org.thymeleaf.standard.processor.AbstractStandardExpressionAttributeTagProcessor.doProcess(AbstractStandardExpressionAttributeTagProcessor.java:144)
        at org.thymeleaf.processor.element.AbstractAttributeTagProcessor.doProcess(AbstractAttributeTagProcessor.java:74)
        at org.thymeleaf.processor.element.AbstractElementTagProcessor.process(AbstractElementTagProcessor.java:95)
        at org.thymeleaf.util.ProcessorConfigurationUtils$ElementTagProcessorWrapper.process(ProcessorConfigurationUtils.java:633)
        at org.thymeleaf.engine.ProcessorTemplateHandler.handleStandaloneElement(ProcessorTemplateHandler.java:918)
        at org.thymeleaf.engine.StandaloneElementTag.beHandled(StandaloneElementTag.java:228)
        at org.thymeleaf.engine.TemplateModel.process(TemplateModel.java:136)
        at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:661)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1103)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1064)
        at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1053)
        at hobbit.mordor.diagui.DiaguiEndpoint.handleSearch(DiaguiEndpoint.java:106)
        at hobbit.mordor.diagui.DiaguiEndpoint.handle(DiaguiEndpoint.java:149)
        at hobbit.mordor.server.JettyRequestHandler.dispatchRequest(JettyRequestHandler.java:273)
        at hobbit.mordor.server.JettyRequestHandler.handle(JettyRequestHandler.java:313)
        at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127)
        at org.eclipse.jetty.server.Server.handle(Server.java:516)
        at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:487)
        at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:732)
        at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:479)
        at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:277)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
        at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
        at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: ognl.OgnlException: source is null for getProperty(null, "lang")

问题原因及解决办法

异常根源是OGNL解析表达式时,错误将T(java.lang.Math)拆解为T(java).lang.Math,进而尝试访问null对象的lang属性,导致报错。

有两种可行的解决方式:

  • 方式一:省略java.lang包名
    java.lang包下的类是Thymeleaf默认导入的,可以直接使用短类名:
    <div th:text="${T(Math).random()}"/>
    
  • 方式二:用单引号包裹完整类名
    将完整类名用单引号括起来,避免OGNL错误解析路径:
    <div th:text="${T('java.lang.Math').random()}"/>
    

验证说明

上述两种方法都能正确触发Math.random()静态方法,生成随机数并渲染到页面。如果调用自定义类的静态方法,需确保类在类路径下,且用单引号包裹完整类名,或者在模板中通过th:import提前导入目标类。

内容的提问来源于stack exchange,提问作者waynewingorc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:25:55