在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器来处理电子邮件

2024-04-08

我在定义 a 时遇到问题ClassLoaderTemplateResolver用于电子邮件和一个ServletContextTemplateResolver用于网络浏览量。我在尝试发送电子邮件时收到以下错误:

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 如下所示:

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

And my 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并且只使用一个解析器。但我需要一个HttpServletRequest, HttpServletResponse and a ServletContext作为参数,这看起来很混乱。

我的结构:

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


我放弃了这个并去了WebContext相反,尽管我每次发送内容时都需要请求、响应和 servletcontext。我就是这样做的:

1. 获取servlet上下文:

@Autowired
ServletContext servletContext;

2. 获取请求和响应作为 sendmail 方法的参数:

HttpServletRequest request,
HttpServletResponse response

3. 创建 WebContext:

final WebContext ctx = new WebContext(request, response, servletContext, locale);

从现在开始就起作用了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器来处理电子邮件 的相关文章

随机推荐