spring boot Thymeleaf Error resolving template

spring boot Thymeleaf加載模板錯誤

  • 開發環境可能碰到的
  • 沒引入spring boot Thymeleaf相關的包,一般少見
  • 模板路徑寫錯
  • 使用layout時,帶了后綴名。如下:top_header后不應有.html
    <header th:replace="common/top_header :: header"></header>
  • 發布后可能碰到的
  • 打包時未將html等資源打包進去,或是打包路徑弄錯。
  • 模板路徑寫的不規范(應該僅限打包為jar的程序,未測試war)
// 前面不能有 / (這樣寫就掛了 ---> /common/top_header)
th:replace="common/top_header :: header"
// Controller 返回的也一樣
return "index";  // 不能寫 "/index"

前端頁面還沒畫完,昨晚下班到家收到領導的消息,讓發布出來看看,結果就出現上面發布后出現的問題

第一個問題,html資源未打包進去,是開始就沒這部分的配置,之前都是打包純java代碼和一些配置文件的,解壓jar包才發現確實少了...

第二個問題,直覺告訴我可能多了個/,刪掉一個打包重新測試,發現ok了,只好都刪了,重新發布完事。比較晚了,也不想調查了。


今天早晨開始調查這個問題,之前寫web程序時,Controller都是這樣寫的return "/index";,感覺很奇怪...

由于開發環境是正常的,只有打完包后才出問題的,只好開啟遠程調試「開啟遠程調試」。

// 發現Thymeleaf在這塊代碼拋出這個錯誤的
try {
    final Resource resource = this.applicationContext.getResource(resourceName);
    if (resource == null) {
        return null;
    }
     // 拋出異常的地方
    return resource.getInputStream();
} catch (final IOException e) {        
}

繼續往下查,到了java的源代碼


代碼跟蹤.png
// 附JDK的getResource源碼
public URL getResource(String name) {
    URL url;
    if (parent != null) {
        url = parent.getResource(name);
    } else {
        url = getBootstrapResource(name);
    }
    if (url == null) {
        url = findResource(name);
    }
    return url;
}

從錯誤和正常執行的流程來看,開發環境和發布環境的處理是不一樣的,一個走系統文件路徑,一個走jar路徑。

// 要加載的模板,這個是找不到模板的寫法,多了一個 /
templates//common/head.html

所以,開發環境得到的流路徑:

// 自動刪除了多余的 / 所以能正常找到模板
/Users/alanwei/Documents/${project_path}/classes/templates/common/head.html

發布環境,因為在jar中找不到templates//common/head.html而掛掉

發布環境正常執行獲取的是ZipFIle


遠程正常.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容