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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25610281/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 08:20:24  来源:igfitidea点击:

Spring boot sending emails using Thymeleaf as template - configuration does not work

javaemailmavenspring-bootthymeleaf

提问by Piotr Kończak

I have a working WebApp based on Spring Boot (newest 1.1.5.RELEASE) and Thymeleaf.
Now I would like to add functionality to send emails and use Thymeleaf as templating engine.

In pom.xml I add:

我有一个基于 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>

Following this tutorial: http://www.thymeleaf.org/doc/articles/springmail.html
I got complete (no XML) Java configuration like that:

按照本教程: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;
    }
}

Folder and files tree is like:

文件夹和文件树是这样的:

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

But it does not work. Application starts correctly but accessing pages (which works without this configuration) causes exception like:

但它不起作用。应用程序正确启动但访问页面(无需此配置即可工作)会导致异常,例如:

Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: Error resolving template "login", template might not exist or might not be accessible by any of the configured Template Resolvers

I tried to put different prefixes into webTemplateResolver.setPrefix but without success.
Also I have noticed reported bug in earlier version of Thymeleaf causing that but looks like it was fixed and I have newer version.

Does anyone see the mistake in this configuration?

请求处理失败;嵌套异常是 org.thymeleaf.exceptions.TemplateInputException:解析模板“登录”时出错,模板可能不存在或可能无法被任何配置的模板解析器访问

我试图将不同的前缀放入 webTemplateResolver.setPrefix 但没有成功。
此外,我还注意到较早版本的 Thymeleaf 中报告的错误导致该错误,但看起来它已修复并且我有更新的版本。

有没有人看到这个配置中的错误?

回答by M. Deinum

The main problem is that you are configuring too much.

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

Spring Boot already configures a TemplateEngineas well as a ThymeleafViewResolver. See the ThymeleafAutoConfigurationfor that. If you look at that classyou will also notice that it will auto detect any ITemplateResolverinstances you might have in your application and it will add it to the SpringTemplateEngine.

Spring Boot 已经配置了一个TemplateEngine和一个ThymeleafViewResolver. 请参阅ThymeleafAutoConfiguration。如果您查看该类,您还会注意到它会自动检测ITemplateResolver您的应用程序中可能存在的任何实例,并将其添加到SpringTemplateEngine.

The solution is quite simple remove everything but the email configuration and the emailTemplateResolver. Everything else will be handled by Spring Boot.

解决方案非常简单,删除除电子邮件配置和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;
    }
}