2015-03-11 9 views
5

Ich verwende Thymeleaf SpringTemplateEngine, um eine HTML-E-Mail in meiner Spring-Anwendung zu erstellen. Als ich pures Spring MVC benutzt habe, war alles perfekt. Jetzt mit Spring Boot kann die Klasse meine .html Vorlage nicht finden. Ich denke, dass das Problem mit ServletContext ist, das den richtigen Pfad nicht zurückgibt, aber ich kann nicht herausfinden, wie es gelöst wird. Sollte ich also einen anderen Kontext verwenden, um die Vorlage zu bearbeiten? Welcher?Verwendung von SpringTemplateEngine bei Verwendung von Spring Boot

Dies ist meine MailService für reine Spring MVC.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.UnsupportedEncodingException; 
import java.util.HashSet; 
import java.util.Locale; 
import java.util.Set; 

import javax.mail.MessagingException; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 
import javax.servlet.ServletContext; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.poi.util.IOUtils; 
import org.springframework.core.io.ByteArrayResource; 
import org.springframework.core.io.InputStreamSource; 
import org.springframework.mail.javamail.JavaMailSenderImpl; 
import org.springframework.mail.javamail.MimeMessageHelper; 
import org.springframework.stereotype.Service; 
import org.thymeleaf.context.WebContext; 
import org.thymeleaf.spring3.SpringTemplateEngine; 
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver; 
import org.thymeleaf.templateresolver.ITemplateResolver; 

@Service 
public class MailService { 

    private JavaMailSenderImpl mailSender; 

    private SpringTemplateEngine templateEngine; 

    public MailService() { 
     mailSender = new JavaMailSenderImpl(); 
     //mailSender config 

     templateEngine = new SpringTemplateEngine(); 
     Set<ITemplateResolver> templatesResolvers = new HashSet<ITemplateResolver>(); 

     ClassLoaderTemplateResolver emailTemplateResolver = new ClassLoaderTemplateResolver(); 
     emailTemplateResolver.setPrefix("mail/"); 
     emailTemplateResolver.setTemplateMode("HTML5"); 
     emailTemplateResolver.setCharacterEncoding("UTF-8"); 
     emailTemplateResolver.setOrder(1); 
     templatesResolvers.add(emailTemplateResolver); 

     ServletContextTemplateResolver webTemplateResolver = new ServletContextTemplateResolver(); 
     webTemplateResolver.setPrefix("/mail/"); 
     webTemplateResolver.setTemplateMode("HTML5"); 
     webTemplateResolver.setCharacterEncoding("UTF-8"); 
     webTemplateResolver.setOrder(2); 
     templatesResolvers.add(webTemplateResolver); 

     templateEngine.setTemplateResolvers(templatesResolvers); 
    } 

    public void sendReport(String nome, String email, String obra, 
      long medicao, HttpServletRequest request, 
      HttpServletResponse response, ServletContext context, Locale locale) 
      throws MessagingException { 

     String subject = "Novo relatório"; 

     final WebContext ctx = new WebContext(request, response, context, 
       locale); 
     ctx.setVariable("nome", nome); 
     ctx.setVariable("obra", obra); 
     ctx.setVariable("data", DataUtils.getInstance().getDataString(medicao)); 
     ctx.setVariable("logo", "logo.jpg"); 

     final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
     final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, 
       true, "UTF-8"); 
     message.setSubject(subject); 
     try { 
      message.setFrom(new InternetAddress(mailSender.getUsername(), 
        "Sistema")); 
     } catch (UnsupportedEncodingException e) { 
     } 
     message.setTo(email); 

     final String htmlContent = this.templateEngine.process(
       "email-relatorio.html", ctx); 
     message.setText(htmlContent, true); 

     try { 
      File file = new File(context.getRealPath("app/img/logo-pro.jpg")); 
      InputStreamSource imageSource = new ByteArrayResource(
        IOUtils.toByteArray(new FileInputStream(file))); 
      message.addInline("logo.jpg", imageSource, "image/jpg"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     this.mailSender.send(mimeMessage); 
    } 
} 

Der Fehler:

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "email-relatorio.html", template might not exist or might not be accessible by any of the configured Template Resolvers 
    at org.thymeleaf.TemplateRepository.getTemplate(TemplateRepository.java:246) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1104) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1060) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1011) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:924) 
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:898) 

Antwort

15

Sie sind mit Spring-Boot dann Frühling Stiefel lassen Sie das Heben schwerer Lasten, die es bereits der Fall ist. Entfernen Sie Ihren Konstruktor und einfach @Autowire die JavaMailSender und SpringTemplateEngine.

Fügen Sie die Mail-Konfiguration dem application.properties hinzu.

spring.mail.host=your-mail-server 
spring.mail.port= 
spring.mail.username 
spring.mail.password 

Fügen Sie den Thymian Blatt-Konfiguration auf die application.properties

# THYMELEAF (ThymeleafAutoConfiguration) 
spring.thymeleaf.check-template-location=true 
spring.thymeleaf.prefix=classpath:/templates/ 
spring.thymeleaf.excluded-view-names= # comma-separated list of view names that should be excluded from resolution 
spring.thymeleaf.view-names= # comma-separated list of view names that can be resolved 
spring.thymeleaf.suffix=.html 
spring.thymeleaf.mode=HTML5 
spring.thymeleaf.encoding=UTF-8 
spring.thymeleaf.content-type=text/html # ;charset=<encoding> is added 
spring.thymeleaf.cache=true # set to false for hot refresh 

Wenn Sie, dass Ihre Klasse

@Service 
public class MailService { 

    @Autowired 
    private JavaMailSender mailSender; 

    @Autowired 
    private SpringTemplateEngine templateEngine; 

    @Value("${spring.mail.username}") 
    private String username; 

    public void enviarRelatorio(String nome, String email, String obra,long medicao, Locale locale) throws MessagingException { 

     String subject = "Novo relatório"; 

     final Context ctx = new Context(locale); 
     ctx.setVariable("nome", nome); 
     ctx.setVariable("obra", obra); 
     ctx.setVariable("data", DataUtils.getInstance().getDataString(medicao)); 
     ctx.setVariable("logo", "logo.jpg"); 

     final MimeMessage mimeMessage = this.mailSender.createMimeMessage(); 
     final MimeMessageHelper message = new MimeMessageHelper(mimeMessage,true, "UTF-8"); 
     message.setSubject(subject); 
     message.setTo(email); 

     try { 
      message.setFrom(new InternetAddress(username, "Sistema")); 
     } catch (UnsupportedEncodingException e) { 
     } 

     final String htmlContent = this.templateEngine.process("email-relatorio", ctx); 
     message.setText(htmlContent, true); 

     try { 
      message.addInline("logo.jpg", new FileSystemResource("imgs/logo-pro.jpg"), "image/jpg"); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     this.mailSender.send(mimeMessage); 
    } 
} 
+0

Hallo ändern getan haben! Ich verwende jetzt application.properties. Das Präfix "classpath:/templates /" löst jedoch den gleichen Fehler aus und wenn ThixmeleafAutoConfiguration auf "templates /" eingestellt ist, wird "Template location: templates/nicht gefunden (bitte fügen Sie einige Vorlagen hinzu oder überprüfen Sie Ihre Thymeleaf-Konfiguration)". Meine Datei befindet sich in src/main/resources/templates. Was vermisse ich? – rcorreia

+2

Vergiss es. Das Problem war, weil ich den vollständigen Namen der Datei übergab, aber es gab ein Suffix. Bitte ändern Sie "email-relatorio.html" zu "email-relatorio" und eine Umwandlung von JavaMailSender zu JavaMailSenderImpl, wenn Sie den getUsername verwenden. Vielen Dank! – rcorreia

+0

Sie sollten nicht "getUsename" umwandeln oder verwenden, sondern nur die Eigenschaft mit einer '@ Value'-basierten Eigenschaft injizieren. Siehe den geänderten Code. Die Besetzung könnte problematisch sein, da AOP verfügbar ist und somit nicht auf die 'JavaMailSenderImpl', sondern nur auf die Schnittstelle umgewandelt werden kann. Außerdem sollten Sie auf Schnittstellen und nicht auf konkrete Klassen programmieren. Auch der 'src/main/resources/templates' ist der Standardspeicherort, so dass Sie ihn nicht konfigurieren müssen. –

Verwandte Themen