我在为电子邮件定义一个 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 作为参数,这看起来很困惑。
我的结构:
知道我的代码有什么问题吗?
最佳答案
我放弃了这个,转而采用 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/