Comment utiliser SpringTemplateEngine lors de l'utilisation de Spring Boot
J'utilise Thymeleaf SpringTemplateEngine pour créer un e-mail HTML sur mon application Spring. Quand j'utilisais Pure Spring MVC, tout était parfait. Maintenant, avec Spring Boot, la classe ne peut pas trouver mon modèle .html. Je pense que le problème est avec ServletContext qui ne renvoie pas le bon chemin, mais je ne peux pas comprendre comment le résoudre. Dois-je donc utiliser un autre contexte pour traiter le modèle? Laquelle?
C'est mon MailService qui travaille pour Pure Spring MVC.
@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);
}
}
L'erreur:
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)
Vous utilisez Spring Boot, puis laissez Spring Boot faire le gros du travail, ce qu'il fait déjà. Supprimez votre constructeur et simplement @Autowire
le JavaMailSender
et SpringTemplateEngine
.
Ajoutez la configuration de messagerie dans le application.properties
.
spring.mail.host=your-mail-server
spring.mail.port=
spring.mail.username
spring.mail.password
Ajoutez la configuration de feuille de thym à l'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
Si vous l'avez fait, changez de classe
@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);
}
}