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的源代码
// 附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