在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器处理电子邮件 [英] Using multiple template resolvers with Spring 3.2 and Thymeleaf 2.1.3 for emails

查看:20
本文介绍了在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器处理电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在为电子邮件定义 ClassLoaderTemplateResolver 和为 Web 视图定义一个 ServletContextTemplateResolver 时遇到问题.我在尝试发送电子邮件时收到以下错误:

I have problem defining a ClassLoaderTemplateResolver for emails and one ServletContextTemplateResolver for web views. I getting the following error when trying to send emails:

HTTP Status 500 - Request processing failed; nested exception is
org.thymeleaf.exceptions.TemplateProcessingException: Resource resolution by ServletContext with
org.thymeleaf.resourceresolver.ServletContextResourceResolver can only be performed when context 
implements org.thymeleaf.context.IWebContext [current context: org.thymeleaf.context.Context]

我的 WebMvcConfig 如下所示:

My WebMvcConfig looks like this:

private static final String VIEWS_PATH = "/WEB-INF/views/";
private static final String MAIL_PATH = "mail/";

@Bean
public ServletContextTemplateResolver templateResolver() {
    final ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix(VIEWS_PATH);
    resolver.setSuffix(".html");
    resolver.setTemplateMode("HTML5");
    resolver.setCharacterEncoding("UTF-8");
    resolver.setOrder(2);
    resolver.setCacheable(false);
    return resolver;
}

@Bean
public ClassLoaderTemplateResolver emailTemplateResolver() {
    final ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    resolver.setPrefix(MAIL_PATH);
    resolver.setSuffix(".html");
    resolver.setTemplateMode("HTML5");
    resolver.setCharacterEncoding("UTF-8");
    resolver.setOrder(1);
    return resolver;
}

@Bean
public SpringTemplateEngine templateEngine() {
    final SpringTemplateEngine engine = new SpringTemplateEngine();
    final Set<TemplateResolver> templateResolvers = new HashSet<TemplateResolver>();
    templateResolvers.add(templateResolver());
    templateResolvers.add(emailTemplateResolver());
    engine.setTemplateResolvers(templateResolvers);
    engine.addDialect(new SpringSocialDialect());
    engine.addDialect(new SpringSecurityDialect());
    return engine;
}

我的 EmailService 是这样的:

@Service
public class EmailService {

@Autowired
private JavaMailSender mailSender;

@Autowired
private TemplateEngine templateEngine;

/*
 * Send HTML mail with inline image
 */
public void sendEmailToBookSeller(
        final ContactBookSellerForm form,
        final Locale locale) throws MessagingException {

    boolean multipart = true;


    boolean isHtml = true;

    // Prepare the evaluation context
    final Context ctx = new Context(locale);

    ctx.setVariable("message", form.getMessage());
    ctx.setVariable("bookTitle", form.getBookTitle());
    ctx.setVariable("email", form.getToEmail());
    ctx.setVariable("logo", "logo");
    ctx.setVariable("logoOnlyText", "logoOnlyText");

    // Prepare message
    final MimeMessage mimeMessage = mailSender.createMimeMessage();

    final MimeMessageHelper message = new MimeMessageHelper(mimeMessage, multipart, "UTF-8");
    message.setSubject("Regarding your book on Mimswell - " + form.getBookTitle());
    message.setFrom(form.getFromEmail());
    message.setTo(form.getToEmail());

    // Create the HTML body using Thymeleaf
    final String htmlContent = templateEngine.process("email-buy-book.html", ctx);

    message.setText(htmlContent, isHtml);

    message.addInline("logo", new ClassPathResource("WEB-INF/views/mail/logo130130red.png"), "image/png");
    message.addInline("logoOnlyText", new ClassPathResource("WEB-INF/views/mail/logo_only_text.png"), "image/png");

    // Send mail
    this.mailSender.send(mimeMessage);
    }
}

错误出现在以下行:

final String htmlContent = templateEngine.process("email-buy-book.html", ctx);

它在哪里使用 ServletContextResourceResolver 而不是我的其他解析器.我希望它使用 ClassLoaderTemplateResolver,因为它可以处理普通的 Context 对象,而不必使用 WebContext.但是,我可以尝试使用 WebContext 代替,因为它实现了 IWebContext 并且只使用一个解析器.但后来我需要一个 HttpServletRequestHttpServletResponse 和一个 ServletContext 作为参数,这似乎很混乱.

Where it is using ServletContextResourceResolver instead of my other resolver. I want it to use ClassLoaderTemplateResolver since it can handle plain Context objects instead of having to use WebContext. However, I could try to use a WebContext instead since it implements the IWebContext and only use one resolver. But then I need a HttpServletRequest, HttpServletResponse and a ServletContext as parameters which seems to messy.

我的结构:

知道我的代码有什么问题吗?

Any idea whats wrong in my code?

推荐答案

由于您(正确地)将 ClassLoaderTemplateResolver 设置为优先于 ServletContextTemplateResolver,Thymeleaf 尝试使用正确的顺序但无法使用前者解析视图,然后尝试后者.
我相信问题在于您设置的前缀和后缀参数与您传递给 templateEngine.process 方法的视图名称相结合.Thymeleaf 将通过连接后缀 + 视图名称 + 后缀来构建您的视图名称,结果为 "mail/email-buy-book.html.html".
尝试只通过email-buy-book",看看是否能解决问题.

Since you (correctly) set the ClassLoaderTemplateResolver to have priority over the ServletContextTemplateResolver, Thymeleaf tries to use the correct order but fails to resolve the view with former and then tries latter.
I believe that the problem is with the prefix and suffix parameters you set combined with the view name you pass to templateEngine.process method. Thymeleaf will construct your view name by concatenating suffix + viewname + suffix resulting to "mail/email-buy-book.html.html".
Try to pass only "email-buy-book" and see if it solves the problem.

这篇关于在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器处理电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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