首页 > 解决方案 > 如何使用 Thymeleaf 从外部文件夹加载模板

问题描述

我正在使用 spring boot 和 thymeleaf 从 html 模板生成文档。

随着模板不断变化,我希望 ti 从外部加载模板只是为了从那里添加或删除模板,而不是重新部署应用程序。

作为 POC,使用 /resources 文件夹时可以正常工作。

这是错误:

解析模板“凭证”时出错,该模板可能不存在或可能无法被任何已配置的模板解析器访问

这是上下文:

应用程序.yml

spring:
  thymeleaf:
    prefix: file:///${PARAMETERS_DIRECTORY_TEMPLATES:/home/app/templates/}
    check-template-location: true
    suffix=: .html
    mode: HTML
    encoding: UTF-8

这是我的方法:其中 templateName 是模板文件名,parameters 只是一个映射,其中包含要被引擎替换的值。

 @Override
public String buildHtmlFromTemplate(String templateName, Map<String, String> parameters) {
    TemplateEngine templateEngine = new TemplateEngine();
    FileTemplateResolver templateResolver = new FileTemplateResolver ();
    templateResolver.setOrder(templateEngine.getTemplateResolvers().size());
    templateResolver.setCacheable(false);
    templateResolver.setCheckExistence(true);

    templateEngine.setTemplateResolver(templateResolver);

    return templateEngine.process(templateName, this.resolveHtmlTemplateAttributesContext(parameters));
}

注意:我删除了应用 yml thymeleaf 配置并实现了下一个代码,但错误仍然存​​在。

@Override
public String buildHtmlFromTemplate(String templateName, Map<String, String> parameters) {
    TemplateEngine templateEngine = new TemplateEngine();
    FileTemplateResolver templateResolver = new FileTemplateResolver ();
    templateResolver.setPrefix("/home/skeeter/templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML");
    templateResolver.setOrder(templateEngine.getTemplateResolvers().size());
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setCacheable(false);
    templateResolver.setCheckExistence(true);

    templateEngine.setTemplateResolver(templateResolver);

    return templateEngine.process(templateName, this.resolveHtmlTemplateAttributesContext(parameters));
}

标签: springspring-bootthymeleaf

解决方案


0

奇怪的是,使用此代码和使用 sudo 创建的 /usr/app/templates 解决了这个问题。我认为这只是一个权限问题

.....
@Value("${parameters.directory.templates}")
private String templatesDirectory;  
.....    


@Override
public String buildHtmlFromTemplate(String templateName, Map<String, String> parameters) {
    TemplateEngine templateEngine = new TemplateEngine();
    FileTemplateResolver templateResolver = new FileTemplateResolver ();
    templateResolver.setPrefix(templatesDirectory);
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("HTML");
    templateResolver.setOrder(templateEngine.getTemplateResolvers().size());
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setCacheable(false);
    templateResolver.setCheckExistence(true);

    templateEngine.setTemplateResolver(templateResolver);

    return templateEngine.process(templateName, this.resolveHtmlTemplateAttributesContext(parameters));
}

推荐阅读