Spring Boot 使用 Thymeleaf 作为模板发送电子邮件 - 配置不起作用

Posted

技术标签:

【中文标题】Spring Boot 使用 Thymeleaf 作为模板发送电子邮件 - 配置不起作用【英文标题】:Spring boot sending emails using Thymeleaf as template - configuration does not work 【发布时间】:2014-10-25 22:40:41 【问题描述】:

我有一个基于 Spring Boot(最新 1.1.5.RELEASE)和 Thymeleaf 的工作 WebApp。 现在我想添加功能来发送电子邮件并使用 Thymeleaf 作为模板引擎。 在 pom.xml 我添加:

<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-mail</artifactId>
</dependency>

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

按照本教程:http://www.thymeleaf.org/doc/articles/springmail.html 我得到了这样的完整(无 XML)Java 配置:

@Configuration
public ThymeleafReplaceConfigurator 
  @Bean 
   public JavaMailSender getJavaMailSenderImpl()
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        Properties props = new Properties();
        /* some properties here */

        javaMailSender.setJavaMailProperties(props);

    return javaMailSender;
    

    @Bean
    public ClassLoaderTemplateResolver emailTemplateResolver()
        ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
        emailTemplateResolver.setPrefix("/mails/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode("HTML5");
        emailTemplateResolver.setCharacterEncoding("UTF-8");
        emailTemplateResolver.setOrder(1);

        return emailTemplateResolver;
    

    @Bean
    public ServletContextTemplateResolver defaultWebTemplateResolver()
        ServletContextTemplateResolver webTemplateResolver = new ServletContextTemplateResolver();
        webTemplateResolver.setPrefix("/templates/");
        webTemplateResolver.setSuffix(".html");
        webTemplateResolver.setTemplateMode("HTML5");
        webTemplateResolver.setCharacterEncoding("UTF-8");
        webTemplateResolver.setOrder(2);

        return webTemplateResolver;
    

    @Bean
    public SpringTemplateEngine templateEngine()
    SpringTemplateEngine templateEngine = new SpringTemplateEngine();
    templateEngine.setTemplateResolver(emailTemplateResolver());
    templateEngine.setTemplateResolver(defaultWebTemplateResolver());
    return templateEngine;
    

    @Bean
    public ThymeleafViewResolver thymeleafViewResolver() 
        ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();

        thymeleafViewResolver.setTemplateEngine(templateEngine());
        thymeleafViewResolver.setCharacterEncoding("UTF-8");

        return thymeleafViewResolver;
    

文件夹和文件树如下:

src
  main
    resources
      templates
        login.html
        error.html
      mails
        exampleMail.html

但它不起作用。应用程序正常启动,但访问页面(无需此配置也能正常工作)会导致以下异常:

请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateInputException:解析模板“登录”时出错,模板可能不存在或可能无法被任何已配置的模板解析器访问 我试图将不同的前缀放入 webTemplateResolver.setPrefix 但没有成功。 此外,我注意到 Thymeleaf 早期版本中报告的错误导致该错误,但看起来它已修复并且我有更新版本。有人看到此配置中的错误吗?

【问题讨论】:

问题是你配置太多了。 Spring Boot 已经为您配置了模板引擎和视图解析器。同样使用不同的解析器两次调用setTemplateResolver 不会做太多,但会覆盖前一个。我建议删除除电子邮件配置和emailTemplateResolver 之外的所有内容,其他所有内容都将由 Spring Boot 处理。 非常感谢 M. Deinum,现在它可以正常工作了。实际上我不知道自动配置的 Spring Boot 会看到我的附加模板解析器开箱即用:) 在查看自动配置的源代码之前我也没有。 【参考方案1】:

主要问题是你配置太多了。

Spring Boot 已经配置了 TemplateEngineThymeleafViewResolver。请参阅ThymeleafAutoConfiguration。如果您look at that class,您还会注意到它会自动检测您的应用程序中可能存在的任何ITemplateResolver 实例,并将其添加到SpringTemplateEngine

解决方案非常简单,删除除电子邮件配置和emailTemplateResolver 之外的所有内容。其他一切都将由 Spring Boot 处理。

@Configuration
public class ThymeleafEmailConfiguration 
   @Bean 
   public JavaMailSender getJavaMailSenderImpl()
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        Properties props = new Properties();
        /* some properties here */

        javaMailSender.setJavaMailProperties(props);

        return javaMailSender;
    

    @Bean
    public ClassLoaderTemplateResolver emailTemplateResolver()
        ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver();
        emailTemplateResolver.setPrefix("/mails/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode("HTML5");
        emailTemplateResolver.setCharacterEncoding("UTF-8");
        emailTemplateResolver.setOrder(1);

        return emailTemplateResolver;
    

【讨论】:

对于 Thymeleaf-2.1.4.RELEASE,如果您在前缀“/”之前使用 ClassLoaderTemplateResolver,TemplateResolution 中似乎存在一些问题。它将通过设置 emailTemplateResolver.setPrefix("mails/");注意“/mails/”前面的“/”被去掉了。 完全相同的问题,但您的解决方案对我不起作用!有什么想法吗?

以上是关于Spring Boot 使用 Thymeleaf 作为模板发送电子邮件 - 配置不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot入门——thymeleaf模板使用

spring boot使用thymeleaf

spring boot中使用thymeleaf

Spring Boot Thymeleaf 模板引擎的使用

学习码匠社区-spring boot 使用bootstrap + thymeleaf 制作导航栏

Spring Boot中使用模板引擎Thymeleaf