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
相关产品推荐
相关产品推荐

