专栏首页13blog.sitethymeleaf模板引擎调用java类中的方法(附源码)

thymeleaf模板引擎调用java类中的方法(附源码)

前言

由于开源了项目的缘故,很多使用了My Blog项目的朋友遇到问题也都会联系我去解决,有的是把问题留在项目的issue里提出,有的是在我的私人博客里留言,还有的则是直接添加我的qq来找我讲自己遇到的问题,有些问题比较简单直接就解决了,有些问题的解决记录也留在issue记录里,有些则是网上有相关教程,至于问题的解决方案,如果时间允许我也会单独的做一篇博客来介绍和解答。

本文中的示例代码地址在:springboot-thymeleaf,希望大家多多支持。

问题分析

在My Blog项目的issue页面收到了这个问题,issue描述的是关于如何在thymeleaf模板页面中如何调用java类中的方法,问题描述如下截图:

但是只有截图,并没有报错原因及错误截图之类的有效信息,那哥们儿也没留下其他的信息,因此只能自己去模拟并试着去解决和分析这个问题,由issue描述可以得出异常信息:

Attempted to call method test() on null context object

从这条异常信息可以大致得出一个答案,调用的test()方法处于一个空对象中,即context域中并没有对应的java实例,因此无法调用。

当天也就回复了这个issue,给出的答案如下:

thymeleaf 的context,即提供数据的地方,基于web的context,即WebContext相对context增加 param,session,application变量,并且自动将request atttributes添加到context variable map,可以在模板直接访问。

虽然给出了答案,但是较为理论派,而且也没有复现此bug,因此又按照issue中的描述重新建了一个springboot+thymeleaf的项目,并且试着重现此问题并解决。

问题重现

重新编写了代码,没有把调用的java实例放入request对象中,重现代码如下:

public class MethodTestController {

    @RequestMapping("/test1")
    public String test1(HttpServletRequest request) {
        return "test";
    }
}    

最终将此问题重现:

将此问题重现后,我又想,如果调用的方法为空会报什么错误呢?试着写了一下:

<p th:text="'调用不存在的方法: ' + ${MethodTest.service()} + '!'"/>

得到了如下的报错:

两个异常分别是:

  • 异常1 :
Attempted to call method on null context object

调用的方法处于一个空对象中,即调用实例为空。
  • 异常2 :
Method cannot be found

方法不存在

这两个异常都属于org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression异常。

问题解决方案

分析至此,异常出现的问题已经无比清晰:

  • 针对于异常1,需要将期望调用的java实例存入thymeleaf的context域中,代码层面即为:将实例对象存入Request对象中。
  • 针对于异常2,则更加简单,仔细检查代码,不要写错调用方法名即可,不要使用未定义的方法。

结语

首发于我的个人博客

如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 短信发送接口被恶意访问的网络攻击事件(三)定位恶意IP的日志分析脚本

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载。 前言 承接前文《短...

    我是十三
  • springboot开启access_log日志输出

    由于在调试时需要查看access_log日志,但是springboot默认并没有开启,因此查看了一下文档,在springboot的配置文件中添加如下设置,即可将...

    我是十三
  • 开启mac上印象笔记的代码块

    我是十三
  • 给出一个生活中的最简单的两层神经网的实际例子

    下面我们给出一个生活中的最简单的两层神经网的实际例子。比如,在我们的心目当中,只要有游泳池这种设施的房子就属于高档住宅。先进行一个初步判断,高还是低? 最后才进...

    马克java社区
  • 8.4 通配符

    ls *.txt *表示通配,不分字符,也不分几个 [root@hf-01 ~]# ls 111 123 1_heard.txt 1_sorft.txt...

    运维小白
  • 从贝叶斯定理到概率分布:综述概率论基本定义

    选自 Medium & analyticsvidhya 机器之心编译 机器之心编辑部 本文从最基础的概率论到各种概率分布全面梳理了基本的概率知识与概念,这些概念...

    机器之心
  • 从贝叶斯定理到概率分布:综述概率论基本定义

    选自 Medium & analyticsvidhya 本文从最基础的概率论到各种概率分布全面梳理了基本的概率知识与概念,这些概念可能会帮助我们了解机器学习或...

    小莹莹
  • 分分钟了解区块链和挖矿

    可能比较难懂,这次发一个简版的图文并茂的视频,方便大家理解。里面有数字签名方面的内容,不了解的可以先看这里:数字签名是什么?

    java达人
  • Flask 进阶学习技巧一

    Flask 提供大量的类,也就是说,你可以通过继承官方提供的各种类,打造一个高度自定义的 Flask , 如下所示:

    迦伦
  • 【编程技巧】条条大路通罗马

    问题:对于一个字节(8bit)的变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能地高。 分析与解法 大多数的读者都会有这样的反应:这个题目也太简单了...

    程序员互动联盟

扫码关注云+社区

领取腾讯云代金券