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

Spring Boot集成Thymeleaf Spring5无法读取WEB-INF内HTML邮件模板

问题原因

WEB-INF目录属于Servlet上下文的私有资源路径,不在Java类路径下,你当前使用的SpringResourceTemplateResolver默认从类路径加载资源,所以即使war包中存在对应文件,类路径资源加载器也无法读取到该路径下的模板。

解决方案

将自定义模板解析器替换为专门读取Servlet上下文资源的ServletContextTemplateResolver,修改你的NotificationTemplateConfiguration配置类即可:

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.ServletContextAware;
import javax.servlet.ServletContext;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.templateresolver.ServletContextTemplateResolver;
import org.thymeleaf.templatemode.TemplateMode;
import java.nio.charset.StandardCharsets;

@Configuration
public class NotificationTemplateConfiguration implements ServletContextAware {

    private ServletContext servletContext;

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;
    }

    @Bean
    @Qualifier(value = "myTemplateEngine")
    public SpringTemplateEngine springTemplateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.addTemplateResolver(myTemplateResolver());
        return templateEngine;
    }

    @Bean
    public ServletContextTemplateResolver myTemplateResolver(){
        ServletContextTemplateResolver myTemplateResolver = new ServletContextTemplateResolver(servletContext);
        // 前缀开头加斜杠,表示从Servlet上下文根路径开始匹配
        myTemplateResolver.setPrefix("/WEB-INF/templates/notifications/");
        myTemplateResolver.setSuffix(".html");
        myTemplateResolver.setTemplateMode(TemplateMode.HTML);
        myTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
        // 可按需启用下面两个配置
        // myTemplateResolver.setOrder(0);
        // myTemplateResolver.setCheckExistence(true);
        return myTemplateResolver;
    }
}
注意事项
  1. 注意你的EmailService类中有一处变量名笔误:注入的模板引擎变量名为m_myTemplateEngine,但buildContent方法中调用的是m_templateEngine,请修正该问题避免空指针异常。
  2. 该方案仅适用于将项目打包为WAR包部署到外置Servlet容器的场景。如果使用Spring Boot内置Tomcat直接运行JAR包,项目结构中不存在WEB-INF目录,该方案无法生效,建议优先选择将模板放在类路径resources/templates下的方案适配更多部署场景。

内容的提问来源于stack exchange,提问作者Borgy Manotoy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:57:02