Spring Boot FreeMarker:如何动态使用自定义模板?

Posted

技术标签:

【中文标题】Spring Boot FreeMarker:如何动态使用自定义模板?【英文标题】:Spring Boot FreeMarker: How to use custom template on the fly? 【发布时间】:2021-11-27 05:05:55 【问题描述】:

我想在我的 Spring Boot 应用中使用 freemarker。模板将从数据库或文件中加载,但我如何将它与 SpringTemplateLoader 一起使用?据我了解,总是期望文件位于磁盘上的某个位置,但在我的情况下,它可以从不同的来源加载。

这是我的测试用例

    File testPdf = getResourceFile("template/test.ftl");
    assertThat(testPdf.exists()).isTrue();
    Map<String, String> model = new HashMap<>();
    model.put("firstName", "Dave");
    model.put("lastName", "Grohl");

    String replacedString = FreeMarkerUtil.getContentFromTemplate(Files.readAllBytes(testPdf.toPath()) , model);
    assertThat(replacedString).isEqualTo(expectedReplacedString);

我正在尝试使用需要 Resourceloader 和 templateLoaderPath 的 SpringTemplateLoader,但我没有路径,我希望从 byte[] 加载模板

public static String getContentFromTemplate(byte[] template, Map<String, String> model)
    ByteArrayResource templateResource = new ByteArrayResource(template);
    SpringTemplateLoader loader = new SpringTemplateLoader(templateResource, )
    
    

或者我需要将 ftl 存储在磁盘上并在 FreeMarker 的配置中配置此路径?

【问题讨论】:

那么不要使用SpringTemplateLoader。编写您自己的TemplateLoader 实例,从数据库中检索它们。然后扩展FreemarkerConfigurer(覆盖postProcessTemplateLoaders方法)并将这个专门的模板加载器添加到加载器列表中。 谢谢,我会试试这个。也许您在网络上有示例或类似的东西? 您需要为您支持的所有不同位置提供TemplateLoader(文件支持开箱即用,因此不应该成为问题)。 如果我将文件存储在配置的目标中,然后使用 SpringTemplateLoader 的默认行为怎么办?那么它也应该工作? 是的,因为它可以解析文件。 【参考方案1】:

FreeMarker 不假定文件来自文件。从哪里加载模板取决于TemplateLoader 实现。因此,您可能希望将 FreeMarker 配置为使用您自己的实现。

请注意,也可以使用Template 构造函数直接从String 创建模板。在某些应用程序中,这是最简单的解决方案。这样做的缺点是不能通过名称从其他模板引用此类模板(例如通过#import#include)。同样对于此类Template 对象,FreeMarker 显然不会为您进行缓存。

【讨论】:

以上是关于Spring Boot FreeMarker:如何动态使用自定义模板?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot:Spring Boot整合FreeMarker

Spring Boot 揭秘与实战 实用技术篇 - FreeMarker 模板引擎

Spring Boot2 系列教程Spring Boot 整合 Freemarker

Spring boot + Freemarker 整合

Spring Boot(24)——使用Freemarker视图

Spring Boot 初体验(10)使用使用freemarker