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