2014-09-01 18 views
6

Ho una WebApp funzionante basata su Spring Boot (più recente 1.1.5.RELEASE) e Thymeleaf.
Ora desidero aggiungere funzionalità per inviare e-mail e utilizzare Thymelaf come motore di template.

In pom.xml aggiungo:
Avvio a molla per l'invio di e-mail utilizzando Thymeleaf come modello - la configurazione non funziona

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

A seguito di questo tutorial: http://www.thymeleaf.org/doc/articles/springmail.html
got completa (senza XML) di configurazione di Java così:

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

cartelle e dei file albero è Mi piace:

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

Ma non funziona. L'applicazione si avvia correttamente ma l'accesso alle pagine (che funziona senza questa configurazione) causa un'eccezione come:

Elaborazione richiesta non riuscita; l'eccezione annidata è org.thymeleaf.exceptions.TemplateInputException: Errore durante la risoluzione del modello "login", il modello potrebbe non esistere o non essere accessibile da nessuno dei Template Resolver configurati

Ho provato a inserire prefissi diversi in webTemplateResolver.setPrefix ma senza successo .
Inoltre ho notato bug segnalato nella versione precedente di Thymeleaf che lo ha causato, ma sembra che sia stato corretto e che io abbia una versione più recente.

Qualcuno vede la nebulizzazione in questa configurazione?

+0

Il problema è che si sta configurando troppo. Spring Boot configura già il motore di template e il resolver di visualizzazione per te. Anche chiamare 'setTemplateResolver' due volte con diversi resolver non farà molto ma scavalca il precedente. Suggerisco di rimuovere tutto tranne la configurazione e-mail e 'emailTemplateResolver', tutto il resto sarà gestito da Spring Boot. –

+0

Grazie mille M. Deinum, ora funziona come dovrebbe. In realtà non sapevo che Spring Boot autoconfigurato vedesse il mio resolver modello aggiuntivo fuori dalla scatola :) –

+0

Neanch'io fino a quando non ho guardato la fonte per la configurazione automatica. –

risposta

17

Il problema principale è che si sta configurando troppo.

Spring Boot configura già un TemplateEngine e un ThymeleafViewResolver. Vedi lo ThymeleafAutoConfiguration per quello. Se hai look at that class noterai anche che rileverà automaticamente tutte le istanze di ITemplateResolver che potresti avere nella tua applicazione e la aggiungerà allo SpringTemplateEngine.

La soluzione è abbastanza semplice rimuovere tutto tranne la configurazione e-mail e il emailTemplateResolver. Tutto il resto sarà gestito da 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

Con Thymeleaf-2.1.4.RELEASE sembra esserci qualche problema in TemplateResolution usando ClassLoaderTemplateResolver se si prefissa "/". Funzionerà impostando emailTemplateResolver.setPrefix ("mails /"); Nota che "/" viene rimosso davanti a "/ mails /". –

Problemi correlati