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; } }
注意事项
- 注意你的
EmailService类中有一处变量名笔误:注入的模板引擎变量名为m_myTemplateEngine,但buildContent方法中调用的是m_templateEngine,请修正该问题避免空指针异常。 - 该方案仅适用于将项目打包为WAR包部署到外置Servlet容器的场景。如果使用Spring Boot内置Tomcat直接运行JAR包,项目结构中不存在WEB-INF目录,该方案无法生效,建议优先选择将模板放在类路径
resources/templates下的方案适配更多部署场景。
内容的提问来源于stack exchange,提问作者Borgy Manotoy
相关产品推荐
相关产品推荐

