2014-10-03 121 views
2

我們目前使用Thymeleaf作爲Spring MVC網站。最近,我們決定使用它來處理豐富的HTML電子郵件模板。我遵循這裏的例子:http://www.thymeleaf.org/doc/springmail.htmlThymeleaf 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機器有什麼不同?起初,我認爲文件路徑的大小寫敏感可能是罪魁禍首,但我將其作爲一種可能性予以消除。 幫助!

回答

0

您是否在本地部署戰爭?或者你在eclipse中測試?如果你不是在本地使用戰爭,那麼就像你部署戰爭一樣打包戰爭。解壓縮並驗證您的模板是否在WEB-INF /類中

只是關於META-INF的一個注意事項,我之前爲/ Spring項目中的/ META-INF /配置文件託管了SpringMVC上下文config我存儲在WEB-INF中。

2

annnnnnnd我是個白癡 ...我不得不在電子郵件模板存儲在一個文件夾的名稱和電子郵件模板名稱,例如之間的反斜槓「folder \ template.html」,而不是「folder/template.html」。這工作在Windows上,但不是在Linux上。

+1

System.getProperty(「file.separator」) – 2014-10-06 21:38:51

+0

錯誤消息有點令人誤解。我誤將thymeleaf模板的整個目錄移動到另一個目錄,並且正在收到此錯誤。很高興你發佈它和你的解決方案! – mkez00 2015-07-31 14:30:57