Mam działającą aplikację WebApp opartą na Spring Boot (najnowszy 1.1.5.RELEASE) i Thymeleaf.
Teraz chciałbym dodać funkcjonalność do wysyłania e-maili i używać Thymelaf jako silnika szablonowego.
W pom.xml dodam:
Wiosenne wysyłanie wiadomości e-mail przy użyciu Thymeleaf jako szablonu - konfiguracja nie działa
<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>
Po tym tutorialu: http://www.thymeleaf.org/doc/articles/springmail.html
dostał kompletne (bez XML) konfiguracja Java tak:
@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ów i plików jest drzewo na przykład:
src
main
resources
templates
login.html
error.html
mails
exampleMail.html
Ale to nie działa. Aplikacja uruchamia się poprawnie, ale dostęp do stron (która działa bez tej konfiguracji) powoduje wyjątek taki jak:
Żądanie przetwarzania nie powiodło się; Zagnieżdżony wyjątek to org.thymeleaf.exceptions.TemplateInputException: Błąd rozwiązania szablonu "login", szablon może nie istnieć lub może nie być dostępny dla żadnego skonfigurowanego narzędzia do rozwiązywania szablonów. Próbowałem umieścić różne prefiksy w pliku webTemplateResolver.setPrefix, ale bez powodzenia .
Zauważyłem również zgłoszony błąd we wcześniejszej wersji Thymeleaf, powodując że, ale wygląda na to, że został naprawiony i mam nowszą wersję.
Czy ktoś widzi mgiełkę w tej konfiguracji?
Problem polega na tym, że konfigurujesz za dużo. Spring Boot już konfiguruje silnik szablonów, a także narzędzie do rozpoznawania widoku. Wywołanie również 'setTemplateResolver' dwa razy z różnymi przelicznikami nie spowoduje większego efektu niż zastąpienie poprzedniego. Proponuję usunąć wszystko poza konfiguracją e-mail i 'mailTemplateResolver' wszystko inne będzie obsługiwane przez Spring Boot. –
Dziękuję bardzo M. Deinum, teraz działa tak, jak powinien. Właściwie nie wiedziałem, że automatycznie skonfigurowany Spring Boot zobaczy mój dodatkowy szablon resolver z pudełka :) –
Ja też nie, dopóki nie spojrzałem na źródło dla automatycznej konfiguracji. –