Spring loading emails using Thymeleaf as a template - setup doesn't work

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

In pom.xml, I add:

<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> 

After this lesson: http://www.thymeleaf.org/doc/articles/springmail.html
I got the full (without XML) Java configuration as follows:

 @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; } } 

The folder and file tree looks like this:

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

But that does not work. The application starts correctly, but access to pages (which works without this configuration) throws an exception, for example:

Request processing error; The nested exception is org.thymeleaf.exceptions.TemplateInputException: error resolving the login template, the template may not exist or may not be available for any of the configured template converters.

I tried to put different prefixes in webTemplateResolver.setPrefix, but to no avail.
I also noticed an error message in an earlier version of Thymeleaf causing this, but it looks like it has been fixed and I have a newer version.

Does anyone see an error in this configuration?

+6
source share
1 answer

The main problem is that you are tuning too much.

Spring Boot is already setting up TemplateEngine as well as ThymeleafViewResolver . For this, see ThymeleafAutoConfiguration . If you look at this class , you will also notice that it will automatically detect any ITemplateResolver instances that you may have in your application, and it will add it to SpringTemplateEngine .

The solution is quite simple to delete everything except the email configuration and emailTemplateResolver . Everything else will be handled by 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; } } 
+17
source

Source: https://habr.com/ru/post/974656/


All Articles