如何在使用Spring Boot时使用SpringTemplateEngine [英] How to use SpringTemplateEngine when using Spring Boot

查看:9191
本文介绍了如何在使用Spring Boot时使用SpringTemplateEngine的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am using Thymeleaf SpringTemplateEngine to create a HTML e-mail on my Spring application. When I was using pure Spring MVC everything was perfect. Now with Spring Boot the class can't find my .html template. I think the problem is with ServletContext that is not returning the right path, but I can't figure out how to resolve it. So should I use another Context to process the template? Which one?

这是我的MailService适用于纯Spring MVC。

This is my MailService working for 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);
    }
}

错误:

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

You are using Spring Boot then let Spring Boot do the heavy lifting, which it already does. Remove your constructor and simply @Autowire the JavaMailSender and SpringTemplateEngine.

将邮件配置添加到 application.properties

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

将百里香叶配置添加到application.properties

Add the thyme leaf configuration to the 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

如果你已经改变了你的班级

If you have done that change your class

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

这篇关于如何在使用Spring Boot时使用SpringTemplateEngine的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆