我們目前使用Thymeleaf作爲Spring MVC網站。最近,我們決定使用它來處理豐富的HTML電子郵件模板。我遵循這裏的例子:http://www.thymeleaf.org/doc/springmail.html。Thymeleaf ClassLoaderTemplateResolver無法找到電子郵件模板,但只在Linux上
ClassLoaderTemplateResolver的前綴爲「email /」,模板存儲在「src/main/resources /」下的「email」子文件夾中,這似乎是它查找它們的地方。
一切正常使用Windows 7/Tomcat7/Eclipse的我的開發機器上很好,但是當我發佈.war文件亞馬遜的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]
我能得到這個錯誤信息的情況發生在我的Windows開發機器上,如果我刪除/重命名從/ src目錄/主/資源/電子郵件模板,所以我假設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;
}
和代碼生成的電子郵件看起來像:用的ClassLoaderTemplateResolver的
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 /模板」的前綴和類似內容。路徑是否不在「src/main/resources」下面而不是「/ src/main/webapp」?我也嘗試用FileTemplateResolver替換它,但不管我嘗試了什麼,我都無法弄清楚放置模板文件的位置以及設置前綴的路徑。
我的windows開發機器和亞馬遜的linux機器有什麼不同?起初,我認爲文件路徑的大小寫敏感可能是罪魁禍首,但我將其作爲一種可能性予以消除。 幫助!
System.getProperty(「file.separator」) – 2014-10-06 21:38:51
錯誤消息有點令人誤解。我誤將thymeleaf模板的整個目錄移動到另一個目錄,並且正在收到此錯誤。很高興你發佈它和你的解決方案! – mkez00 2015-07-31 14:30:57