升级到Thymeleaf 3并在Spring中重新实现丰富的HTML电子邮件

时间:2016-09-21 11:42:44

标签: java spring thymeleaf

我正在将我的项目从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文档中那样。

有关如何使用此工作或文档的任何建议我可能忽略了吗?

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;