Thymeleaf+Spring Boot遇FileNotFoundException:无法找到资源文件
哈哈,这个问题我简直感同身受——手动配置Thymeleaf的时候踩过一模一样的坑,明明文件就在resources目录里,程序偏说找不到,属实又气又好笑!
问题根源
本质上是ServletContextTemplateResolver的资源查找逻辑和Spring Boot的资源目录结构没匹配上:
ServletContextTemplateResolver默认是从Web应用的根路径(比如war包的/WEB-INF同级目录)查找模板- 但Spring Boot里你把模板放在
src/main/resources/templates,这个目录在打包后会被放到classpath下,ServletContext默认不会自动映射到这个路径,自然就抛出FileNotFoundException了
解决方案
我给你两个可行的方案,按需选就行:
方案1:调整ServletContextTemplateResolver的路径配置
如果你非要用ServletContextTemplateResolver,只要把模板前缀设置为"/templates/",同时确保后缀和模板模式配置正确就行。完整配置代码如下:
@Configuration public class ThymeleafConfig { @Bean public ServletContextTemplateResolver thymeleafTemplateResolver(ServletContext servletContext) { ServletContextTemplateResolver resolver = new ServletContextTemplateResolver(servletContext); // 关键:设置正确的前缀,Spring Boot会自动把resources/templates映射为web可访问的/templates路径 resolver.setPrefix("/templates/"); resolver.setSuffix(".html"); // 匹配你的模板文件后缀 resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); resolver.setCacheable(false); // 开发环境建议关闭缓存,改完模板不用重启 return resolver; } // 别忘了配套配置SpringTemplateEngine和ViewResolver @Bean public SpringTemplateEngine springTemplateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver); return engine; } @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setCharacterEncoding("UTF-8"); return resolver; } }
另外还要检查两个细节:
- 模板文件确实在
src/main/resources/templates目录下,比如你请求/home,对应的文件得是home.html - 文件名要注意大小写(Linux/线上环境大小写敏感,Windows不敏感,别踩坑)
方案2:换成ClasspathTemplateResolver(更推荐)
ServletContextTemplateResolver更适合传统war包部署的Web项目,而Spring Boot常用jar包部署,这时候ClasspathTemplateResolver更适配——它直接从classpath加载资源,不管是jar还是war部署都能正常工作。配置代码更简洁:
@Configuration public class ThymeleafConfig { @Bean public ClasspathTemplateResolver thymeleafTemplateResolver() { ClasspathTemplateResolver resolver = new ClasspathTemplateResolver(); resolver.setPrefix("templates/"); // classpath路径不需要开头的斜杠 resolver.setSuffix(".html"); resolver.setTemplateMode(TemplateMode.HTML); resolver.setCharacterEncoding("UTF-8"); return resolver; } // 同样需要配置SpringTemplateEngine和ViewResolver,代码和方案1一致 @Bean public SpringTemplateEngine springTemplateEngine(ITemplateResolver templateResolver) { SpringTemplateEngine engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver); return engine; } @Bean public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine); resolver.setCharacterEncoding("UTF-8"); return resolver; } }
最后验证
配置完之后,重启项目,请求对应的路径(比如/home对应templates/home.html),应该就能正常加载模板了!
内容的提问来源于stack exchange,提问作者Zain
相关产品推荐
相关产品推荐

