You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:46:47