我正在将我的项目从Thymeleaf 2迁移到3,我遇到了电子邮件模板解析器干扰我的网页模板解析器的问题。
当我们第一次实施Thymeleaf时,我们遵循此文档以允许电子邮件模板和Web模板,并且没有问题(第4.2节):
http://www.thymeleaf.org/doc/articles/springmail.html
在转换为Thymeleaf 3期间,我只使用了一个HTML模板的模板解析器(使用SpringResourceTemplateResolver)并且转换很好。我能够毫无问题地运行我的应用程序,并且所有视图模板都可以正常呈现。
但是,当包含电子邮件模板解析程序(使用ClassLoaderTemplateResolver)时,转到任何返回视图的控制器端点时会发生以下错误:
java.io.FileNotFoundException: ClassLoader resource "thymeleaf/thymeleaf/login.html" does not exist
这表明它正在尝试从ClassLoaderTemplateResolver而不是SpringResourceTemplateResolver加载模板。在Thymeleaf 2中,Order属性解决了这个问题,但这似乎在Thymeleaf 3中无效。
我在Thymeleaf 3文档中找不到任何有关2个模板解析器的帮助,就像在Thymeleaf 2文档中那样。
有关如何使用此工作或文档的任何建议我可能忽略了吗?
答案 0 :(得分:3)
我有相同的设置(电子邮件的ClassLoaderTemplateResolver和html页面模板的SpringResourceTemplateResolver)。我想你需要设置这个属性:
resolver.setCheckExistence(true);
在你的模板解析器中首先出现的情况下,否则spring会认为它存在,你会看到你看到的错误。
答案 1 :(得分:0)
您可以使用以下设置..
<强> AppConfig.java 强>
@Configuration
@EnableWebMvc
@ComponentScan("myapp")
public class AppConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) {
this.applicationContext = applicationContext;
}
@Bean
public ViewResolver viewResolver() {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(webTemplateEngine());
resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
return resolver;
}
@Bean
public TemplateEngine webTemplateEngine() {
//this method must be defined as a bean otherwise i18n messages are not found
SpringTemplateEngine engine = new SpringTemplateEngine();
engine.setEnableSpringELCompiler(true);
engine.addTemplateResolver(webTemplateResolver());
return engine;
}
private ITemplateResolver webTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setSuffix(".html");
resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
return resolver;
}
@Bean
public TemplateEngine emailTemplateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(emailTemplateResolver());
return templateEngine;
}
private ITemplateResolver emailTemplateResolver() {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/email/");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setSuffix(".html");
resolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
return resolver;
}
}
然后您需要使用电子邮件模板引擎,只需自动连接 emailTemplateEngine 并使用它
@Autowired
private TemplateEngine emailTemplateEngine;