Java Thymeleaf ClassLoaderTemplateResolver can';无法找到电子邮件模板,但只能在linux上找到

Java Thymeleaf ClassLoaderTemplateResolver can';无法找到电子邮件模板,但只能在linux上找到,java,spring,spring-mvc,thymeleaf,Java,Spring,Spring Mvc,Thymeleaf,我们目前正在为SpringMVC网站使用Thymeleaf。最近,我们决定使用它来处理丰富的HTML电子邮件模板。我遵循了下面的示例: ClassLoaderTemplateResolver的前缀为“email/”,模板存储在“src/main/resources/”下的“email”子文件夹中,该文件夹似乎就是它查找模板的地方 在我使用Windows 7/Tomcat7/Eclipse的开发机器上,一切正常,但在我将.war文件发布到Amazon的EC2(Linux环境/Tomcat7)并尝试

我们目前正在为SpringMVC网站使用Thymeleaf。最近,我们决定使用它来处理丰富的HTML电子邮件模板。我遵循了下面的示例:

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

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

错误C:U:org.thymeleaf.TemplateEngine- [THYMELEAF][pool-2-thread-2]异常处理模板 “email_template.html”:ServletContext的资源解析 使用org.thymeleaf.resourcesolver.ServletContextResourceResolver可以 仅当上下文实现时才能执行 org.thymeleaf.context.IWebContext[当前上下文: 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;
}
奇怪的是,我见过前缀为“/META-INF/templates”的ClassLoaderTemplateResolver和类似的例子。路径不是必须在“src/main/resources”下,而不是“/src/main/webapp”下吗?我还尝试用FileTemplateResolver替换它,但无论我做了什么尝试,我都不知道将模板文件放在哪里以及将前缀设置为什么路径

我的windows开发机器和Amazon的linux机器有什么不同?起初,我认为文件路径的大小写敏感性可能是罪魁祸首,但我排除了这种可能性。
救命啊

你在当地部署了战争吗?或者您正在eclipse中进行测试?如果您没有在本地使用war,请像部署war时那样打包war。解压缩它并验证模板是否在WEB-INF/classes中


只是一个关于META-INF的旁注,我以前为spring项目托管过/META-INF/的配置文件,它是我存储在WEB-INF中的SpringMVC上下文配置。

annnnnd我是个白痴。。。我在存储电子邮件模板的文件夹名称和电子邮件模板名称之间使用了反斜杠,例如“folder\template.html”,而不是“folder/template.html”。这在windows上有效,但在linux上无效。

System.getProperty(“file.separator”)错误消息有点误导。我错误地将thymeleaf模板的整个目录移动到另一个目录,并收到此错误。很高兴你发布了它和你的解决方案!
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);