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

标签 java email maven spring-boot thymeleaf

我有一个基于 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 已经配置了一个 TemplateEngine 以及一个 ThymeleafViewResolver。查看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;
    }
}

关于java - 使用 Thymeleaf 作为模板的 Spring Boot 发送电子邮件 - 配置不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25610281/

相关文章:

java - 错误: Could not create Java Virtual Machine when launching javaw - viewer

java.lang.NoClassDefFoundError : com/fasterxml/jackson/core/JsonFactory getting this error even after adding the desired imports

JAVA - 单选按钮已选中

java - Maven 内部存储库中缺少 Artifact

java - 将数组分成两半并找到两个最大值,然后合并这两个值

python - 收到电子邮件后触发脚本

bash - 通过 bash curl 发送邮件

android - 如何在 Android 手机上创建动画电子邮件/短信通知?

java - Intellij Idea Maven 'cannot reconnect' 错误

java - 如何使用versions-maven-plugin设置子模块版本?