java - Thymeleaf ClassLoaderTemplateResolver 找不到电子邮件模板,但只能在 linux 上找到

标签 java spring spring-mvc thymeleaf

我们目前正在将 Thymeleaf 用于 Spring MVC 网站。最近,我们决定用它来处理丰富的 HTML 电子邮件模板。我按照这里的例子:http://www.thymeleaf.org/doc/springmail.html .

ClassLoaderTemplateResolver 的前缀为“email/”,模板存储在“src/main/resources/”下的“email”子文件夹中,这似乎是它寻找它们的地方。

在我使用 Windows 7/Tomcat7/Eclipse 的开发机器上一切正常,但当我将 .war 文件发布到 Amazon 的 EC2(Linux 环境/Tomcat7)并尝试生成电子邮件时失败。这是错误:

ERROR C: U: org.thymeleaf.TemplateEngine - [THYMELEAF][pool-2-thread-2] Exception processing template "email_template.html": 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]

如果我从/src/main/resources/email 中删除/重命名模板,我可以在我的 Windows 开发机器上收到此错误消息,所以我假设 ClassLoaderTemplateResolver 找不到模板,然后找不到模板引擎尝试无法使用的 ServletContextResourceResolver,因为它没有 WebContext。

基于 java 的配置如下所示:

@Bean
public ServletContextTemplateResolver templateResolver() {
    final ServletContextTemplateResolver resolver = new ServletContextTemplateResolver();
    resolver.setPrefix("/WEB-INF/templates/");
    resolver.setTemplateMode("HTML5");
    resolver.setCharacterEncoding(appSettings.getDefaultEncoding());
    resolver.setOrder(2);
    resolver.setCacheable(!appSettings.isDebugMode() || !appSettings.isOneBoxMode());
    return resolver;
}

@Bean ClassLoaderTemplateResolver emailTemplateResolver() {
    final ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
    resolver.setPrefix("email/");
    resolver.setTemplateMode("HTML5");
    resolver.setCharacterEncoding(appSettings.getDefaultEncoding());
    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);
    return engine;
}

生成电子邮件的代码如下所示:

final String template = "email_template.html";

// prepare the context
final Context ctx = new Context(LocaleContextHolder.getLocale());

// create the body using ThymeLeaf
final String htmlContent = templateEngine.process(template, ctx);

奇怪的是,我看到了带有“/META-INF/templates”前缀的 ClassLoaderTemplateResolver 示例和类似的示例。路径不是必须在“src/main/resources”下而不是“/src/main/webapp”下吗?我也尝试用 FileTemplateResolver 替换它,但无论我尝试什么,我都无法弄清楚将模板文件放在哪里以及将前缀设置到什么路径。

我的 Windows 开发机器和亚马逊的 Linux 机器有什么不同?起初,我认为文件路径的区分大小写可能是罪魁祸首,但我排除了这种可能性。 帮助!

最佳答案

annnnnnnd 我是个白痴...我在存储电子邮件模板的文件夹名称和电子邮件模板名称之间有一个反斜杠,例如“folder\template.html”,而不是“folder/template.html”。这适用于 Windows,但不适用于 Linux。

关于java - Thymeleaf ClassLoaderTemplateResolver 找不到电子邮件模板,但只能在 linux 上找到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26186464/

相关文章:

java - 创建名为“org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping”的 bean 时出错

java - Spring MVC - 在任何人进入网页之前做某事

java - 如何修复 swing 和 util timer 冲突?

java - 如何使用 Junit 和 Mockito 使用 spring 存储库测试 void 方法

spring - 如何执行关于Spring批处理JdbcItemWriter的多个SQL

java - Spring Boot 中的 JsonView 不过滤响应

java - 抛出自定义异常时如何动态确定方法签名?

java - 为什么我的递归不断抛出 StackOverflow 错误?

spring - 在spring mvc中放置辅助类的位置

java - 将 Spring 配置文件添加到应用程序上下文