在My Blog项目的issue页面收到了这个问题,issue描述的是关于如何在thymeleaf模板页面中如何调用java类中的方法,问题描述如下截图:
但是只有截图,并没有报错原因及错误截图之类的有效信息,那哥们儿也没留下其他的信息,因此只能自己去模拟并试着去解决和分析这个问题,由issue描述可以得出异常信息:
Attemptedto call method test()onnullcontextobject
从这条异常信息可以大致得出一个答案,调用的test()方法处于一个空对象中,即context域中并没有对应的java实例,因此无法调用。
当天也就回复了这个issue,给出的答案如下:
thymeleaf 的context,即提供数据的地方,基于web的context,即WebContext相对context增加 param,session,application变量,并且自动将request atttributes添加到context variable map,可以在模板直接访问。
虽然给出了答案,但是较为理论派,而且也没有复现此bug,因此又按照issue中的描述重新建了一个springboot+thymeleaf的项目,并且试着重现此问题并解决。
问题重现
重新编写了代码,没有把调用的java实例放入request对象中,重现代码如下:
publicclassMethodTestController{
@RequestMapping("/test1")
publicStringtest1(HttpServletRequestrequest){
return"test";
}
}
最终将此问题重现:
将此问题重现后,我又想,如果调用的方法为空会报什么错误呢?试着写了一下:
得到了如下的报错:
两个异常分别是:
异常1 :
Attemptedto call method onnullcontextobject
调用的方法处于一个空对象中,即调用实例为空。
异常2 :
Methodcannot be found
方法不存在
这两个异常都属于org.thymeleaf.exceptions.TemplateProcessingException:ExceptionevaluatingSpringELexpression异常。
问题解决方案
分析至此,异常出现的问题已经无比清晰:
针对于异常1,需要将期望调用的java实例存入thymeleaf的context域中,代码层面即为:将实例对象存入Request对象中。
针对于异常2,则更加简单,仔细检查代码,不要写错调用方法名即可,不要使用未定义的方法。
结语
首发于我的个人博客。
如果有问题或者有一些好的创意,欢迎给我留言,也感谢向我指出项目中存在问题的朋友。
代码和这次的问题都是My Blog项目中的,如果你想继续了解该项目可以查看整个系列文章Java开源博客My-Blog(SpringBoot+Docker)系列文章,也可以到我的GitHub仓库或者开源中国代码仓库中查看源码及详细的部署过程和使用文档。