Thymeleaf:模板可能不存在,或者任何已配置的模板解析器都可能无法访问

时间:2017-04-07 14:01:56

标签: spring tomcat thymeleaf

我有这段代码:

private static final String EMAIL_INLINEIMAGE_TEMPLATE_NAME = "templateemail.html";

@Bean
public TemplateEngine emailTemplateEngine() {
    templateEngine = new SpringTemplateEngine();
    templateEngine.addTemplateResolver(this.htmlTemplateResolver());
       )

    templateEngine.setTemplateEngineMessageSource(this.messageSource);
    return templateEngine;
}

private static ITemplateResolver htmlTemplateResolver() {
    final ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setOrder(Integer.valueOf(0));
    templateResolver.setPrefix("classpath:/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode(TemplateResolver.DEFAULT_TEMPLATE_MODE);
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setCacheable(false);
    return templateResolver;
}


public void sendEmail(String emailAddress, String title, String body, Locale local, String image) {
    if (Boolean.parseBoolean(isEmailServiceActivated)) {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        MimeMessageHelper mailMsg = new MimeMessageHelper(mimeMessage);
        try {
            mailMsg.setFrom(EMAIL_USERNAME);
            mailMsg.setTo(emailAddress);
            mailMsg.setSubject(title);

            // Prepare the evaluation context
            ctx.setLocale(local);
            ctx.setVariable("imageHeaderResourceName", HEADER_LOGO_IMAGE);
            ctx.setVariable("body", body);

            ctx.setVariable("imageResourceName", image);

            final String htmlContent = this.templateEngine.process(new ClassPathResource(EMAIL_INLINEIMAGE_TEMPLATE_NAME).getPath(), ctx);
            mailMsg.setText(htmlContent, true );

            mailMsg.addInline(HEADER_LOGO_IMAGE, new ClassPathResource(HEADER_LOGO_IMAGE ) , PNG_MIME);
            mailMsg.addInline(image, new ClassPathResource(image) , PNG_MIME);

        } catch (MessagingException e) {
            e.printStackTrace();
        }

        mailSender.send(mimeMessage);
    }
}

我在/ templates /目录下有templateemail.html文件。当我启动发送电子邮件方法时,我有这个例外:

org.thymeleaf.exceptions.TemplateInputException: Error resolving template "templateemail.html", template might not exist or might not be accessible by any of the configured Template Resolvers

我不知道是不是因为templateEngine无法找到我的文件(我尝试使用tomcat绝对路径和/ bin目录但没办法)或者我没有配置正确的模板解析器。 非常感谢您的帮助。我

4 个答案:

答案 0 :(得分:5)

现在通过删除" .html"在模板名称(文件具有html扩展名)

private static final String EMAIL_INLINEIMAGE_TEMPLATE_NAME = "templateemail"

答案 1 :(得分:2)

请注意可能发生的非跨平台行为:在Windows上,CamelCase.html模板已解决,但在Ubuntu linux上没有!在那里我不得不将它重命名为camelcase.html,小写的所有字符

答案 2 :(得分:0)

我最近有同样的问题。我的问题是我的模板引用了其他以/开头的模板。

例如:

<html ... th:include="/internal/layout-normal :: page">   <-- failed

<html ... th:include="internal/layout-normal :: page">    <-- worked

当我从IntelliJ运行应用程序时,这两种变体都可以正常工作。但是,打包并通过java -jar运行时,第一行失败。

删除/为我解决了问题

答案 3 :(得分:0)

Thymeleaf通过使用html文件的名称从资源/模板路径中获取html文件。 因此,在这种情况下,只需从文件名中删除.html扩展名即可!