前言
《Docker+SpringBoot+Mybatis+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,則更加簡單,仔細檢查代碼,不要寫錯調用方法名即可,不要使用未定義的方法。
結語
首發於我的個人博客。
如果有問題或者有一些好的創意,歡迎給我留言,也感謝向我指出項目中存在問題的朋友。
代碼和這次的問題都是My Blog項目中的,如果你想繼續了解該項目可以查看整個系列文章Java開源博客My-Blog(SpringBoot+Docker)系列文章,也可以到我的GitHub倉庫或者開源中國代碼倉庫中查看源碼及詳細的部署過程和使用文檔。