Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
615 views
in Technique[技术] by (71.8m points)

java - Spring boot + Thymeleaf - multiple template resolvers with fallback to default

I am trying to add support for emails with Thymeleaf templates in my Spring Boot app. It works fine as long as I am using only templates stored as .html files. What I would like to do is add support for "overriding" these files with user configured templates. So if template exists in DB, use it. Otherwise, try to use the one from file.

My config looks as follows:

@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;
    }

}

And database resolver:

@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;
    }

}

The template is found in DB here and gets returned but I get the following error:

[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)

Does anyone know what am I doing wrong?


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I hope you are fine, Did you see this answer?

How to read a Thymeleaf template from DB

I think it's because of the prefix or suffix that you set.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...