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