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倉庫或者開源中國代碼倉庫中查看源碼及詳細的部署過程和使用文檔。

相關文章
相關標籤/搜索