【问题标题】:How to Load templates from external folder using Thymeleaf如何使用 Thymeleaf 从外部文件夹加载模板
【发布时间】:2020-08-10 14:49:06
【问题描述】:

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

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

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

这是错误:

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

这是上下文:

applycation.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));
}

【问题讨论】:

  • 这将解决您的请求forum.thymeleaf.org/…
  • 感谢@SounakSaha,我已经阅读了这篇文章。我认为我使用了正确的解析器,但无法理解我缺少什么。
  • 在 Java 代码中为 FileTemplateResolver 设置前缀时,您可以使用简单的文件路径 - 例如,/path/to/templatesDir/ - 不使用 URL 样式的 file://。我不知道语法是否仅仅因为您使用的是 Spring 的application.yml 而不同。尝试注释掉配置文件中的prefix 行,并在您的Java 代码中添加templateResolver.setPrefix("/path/to/templatesDir/"); 作为测试。
  • @andrewjames 我尝试将所有配置移动到代码中,但错误仍然存​​在

标签: spring spring-boot thymeleaf


【解决方案1】:

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

【讨论】:

  • 我仍然面临这个问题
  • 请给我们更多信息。
【解决方案2】:

在我的例子中,我使用的是ClassLoaderTemplateResolver,但是在我将其更改为FileTemplateResolver 之后,我可以使用绝对路径并且它工作正常。

仔细检查您在拥有模板的目录中是否具有读取权限。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2020-10-28
    • 2015-10-16
    相关资源
    最近更新 更多