如何在使用Spring Boot时使用SpringTemplateEngine

我正在使用Thymeleaf SpringTemplateEngine在我的Spring应用程序上创建HTML电子邮件。 当我使用纯Spring MVC时,一切都很完美。 现在使用Spring Boot,类无法找到我的.html模板。 我认为问题在于ServletContext没有返回正确的路径,但我无法弄清楚如何解决它。 那么我应该使用另一个Context来处理模板吗? 哪一个?

这是我的MailService为纯Spring MVC工作。

@Service public class MailService { private JavaMailSenderImpl mailSender; private SpringTemplateEngine templateEngine; public MailService() { mailSender = new JavaMailSenderImpl(); //mailSender config templateEngine = new SpringTemplateEngine(); Set templatesResolvers = new HashSet(); 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); } } 

错误:

 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) 

您正在使用Spring Boot,然后让Spring Boot完成繁重的工作。 删除你的构造函数,只需@Autowire JavaMailSenderSpringTemplateEngine

将邮件配置添加到application.properties

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

将百里香叶配置添加到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= is added spring.thymeleaf.cache=true # set to false for hot refresh 

如果你这样做了改变你的课程

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