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

前言

《Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦》html

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

本文中的示例代码地址在:springboot-thymeleaf,但愿你们多多支持。git

问题分析

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

thymeleaf issue

可是只有截图,并无报错缘由及错误截图之类的有效信息,那哥们儿也没留下其余的信息,所以只能本身去模拟并试着去解决和分析这个问题,由issue描述能够得出异常信息:web

Attempted to call method test() on null context object

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

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

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

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

问题重现

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

public class MethodTestController {

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

最终将此问题重现:
null object

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

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

获得了以下的报错:
null method

两个异常分别是:

  • 异常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,则更加简单,仔细检查代码,不要写错调用方法名便可,不要使用未定义的方法。

结语

首发于个人我的博客

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

代码和此次的问题都是My Blog项目中的,若是你想继续了解该项目能够查看整个系列文章Java开源博客My-Blog(SpringBoot+Docker)系列文章,也能够到个人GitHub仓库或者开源中国代码仓库中查看源码及详细的部署过程和使用文档。

相关文章
相关标签/搜索