【问题标题】:Spring boot + Thymeleaf - multiple template resolvers with fallback to defaultSpring boot + Thymeleaf - 具有回退到默认值的多个模板解析器
【发布时间】:2021-01-08 13:38:48
【问题描述】:

我正在尝试在我的 Spring Boot 应用程序中添加对带有 Thymeleaf 模板的电子邮件的支持。只要我只使用存储为.html 文件的模板,它就可以正常工作。我想做的是添加对使用用户配置的模板“覆盖”这些文件的支持。因此,如果数据库中存在模板,请使用它。否则,请尝试使用文件中的那个。

我的配置如下:

@Configuration
public class ThymeleafConfig {

    @Bean
    public SpringTemplateEngine springTemplateEngine(DatabaseTemplateResolver databaseTemplateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        databaseTemplateResolver.setTemplateMode(TemplateMode.HTML);
        templateEngine.addTemplateResolver(databaseTemplateResolver);
        return templateEngine;
    }

    @Bean
    public SpringResourceTemplateResolver htmlTemplateResolver() {
        SpringResourceTemplateResolver emailTemplateResolver = new SpringResourceTemplateResolver();
        emailTemplateResolver.setPrefix("/templates/");
        emailTemplateResolver.setSuffix(".html");
        emailTemplateResolver.setTemplateMode(TemplateMode.HTML);
        emailTemplateResolver.setCharacterEncoding(StandardCharsets.UTF_8.name());
        return emailTemplateResolver;
    }

}

和数据库解析器:

@RequiredArgsConstructor
@Component
public class DatabaseTemplateResolver extends StringTemplateResolver {

    @Qualifier("htmlTemplateResolver")
    private final SpringResourceTemplateResolver htmlTemplateResolver;

    @Override
    public ITemplateResource computeTemplateResource(IEngineConfiguration configuration, String ownerTemplate, String templateName, Map<String, Object> templateResolutionAttributes) {
        model.runInTransaction(tx -> {
            Optional<Template> template = // load template from DB;

            if (template.isPresent()) {
                return super.computeTemplateResource(configuration, ownerTemplate, template.get().getContent(), templateResolutionAttributes);
            } else {
                return htmlTemplateResolver.resolveTemplate(configuration, ownerTemplate, templateName, templateResolutionAttributes);
            }
        }, TransactionDescriptor.asSystemUser());

        return null;
    }

}

模板在此处的 DB 中找到并返回,但出现以下错误:

[THYMELEAF][task-2] Exception processing template "email-notification": Error resolving template [email-notification], template might not exist or might not be accessible by any of the configured Template Resolvers
org.thymeleaf.exceptions.TemplateInputException: Error resolving template [email-notification], template might not exist or might not be accessible by any of the configured Template Resolvers
    at org.thymeleaf.engine.TemplateManager.resolveTemplate(TemplateManager.java:869)
    at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:607)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1098)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1059)
    at org.thymeleaf.TemplateEngine.process(TemplateEngine.java:1048)

有谁知道我做错了什么?

【问题讨论】:

    标签: java spring-boot thymeleaf


    【解决方案1】:

    希望你没事,你看到这个答案了吗?

    How to read a Thymeleaf template from DB

    我认为是因为你设置的前缀或后缀。

    【讨论】:

    • 嗨,谢谢...这是前缀配置错误。多么愚蠢的错误……花了很长时间调试这个。
    猜你喜欢
    • 2016-01-27
    • 2020-03-14
    • 2016-01-30
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2021-09-25
    • 2018-11-30
    • 2020-05-14
    相关资源
    最近更新 更多