2014-09-01 18 views
6

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?

+0

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

+0

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 :) –

+0

Ja też nie, dopóki nie spojrzałem na źródło dla automatycznej konfiguracji. –

Odpowiedz

17

Głównym problemem jest to, że konfigurujesz za dużo.

Spring Boot już skonfigurował TemplateEngine, a także ThymeleafViewResolver. Zobacz ThymeleafAutoConfiguration do tego. Jeśli podłączysz look at that class, zauważysz, że automatycznie wykryje on wszystkie instancje ITemplateResolver w aplikacji i doda je do SpringTemplateEngine.

Rozwiązanie jest dość proste. Usuń wszystko oprócz konfiguracji e-mailowej i emailTemplateResolver. Wszystko inne będzie obsługiwane przez 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; 
    } 
} 
+2

Z Thymeleaf-2.1.4.RELEASE wydaje się być pewien problem w TemplateResolution przy użyciu ClassLoaderTemplateResolver, jeśli przedrostek "/". Będzie działać poprzez ustawienie emailTemplateResolver.setPrefix ("mail /"); Należy zauważyć, że "/" jest usuwany przed "/ mail /". –