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

标签 spring spring-mvc thymeleaf

我在为电子邮件定义一个 ClassLoaderTemplateResolver 和为 Web View 定义一个 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;
}

我的 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 和 ServletContext 作为参数,这看起来很困惑。

我的结构:

File structure

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

最佳答案

我放弃了这个,转而采用 WebContext 方法,尽管每次发送内容时我都需要请求、响应和 servletcontext。我就是这样做的:

<强>1。获取servlet上下文:

@Autowired
ServletContext servletContext;

<强>2。获取请求和响应作为 sendmail 方法的参数:

HttpServletRequest request,
HttpServletResponse response

<强>3。相反,创建 WebContext:

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

从现在开始就可以了。

关于spring - 在 Spring 3.2 和 Thymeleaf 2.1.3 中使用多个模板解析器来处理电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26609226/

相关文章:

java - 删除数据库中具有外键的Hibernate实体

javascript - 如何使用 jquery 在 html 上显示 ajax 列表响应?

hyperlink - 在 thymeleaf 中转义 '&' 字符

java - 为什么 applicationContext.xml 中需要 <beans> 属性?

spring - @RestControllerAdvice 和 @ControllerAdvice 在一起

java - Spring @Transactional方法——参与事务

java - CronSequenceGenerator 的解决方法是每月的最后一天?

java - 我的 spring 安全代码没有使用静态资源,如 css、js 和图像文件夹

spring-mvc - Tomcat7 部署失败 : org. apache.catalina.LifecycleException : Failed to start component/w org. springframework.web.servlet.DispatcherServlet

java - 无法从表单读取字符串