从类路径设置 freemarker 模板

Posted

技术标签:

【中文标题】从类路径设置 freemarker 模板【英文标题】:Setting freemarker template from classpath 【发布时间】:2011-03-02 10:57:50 【问题描述】:

我有一个需要手动获取 Freemarker 模板的 Web 应用程序 - 该模板是通过库项目中的类获得的,但实际的 tpl 文件包含在 Web 应用程序类路径中。因此,有 2 个项目,一个 'taac-backend-api' 和另一个 'taac-web'; taac-backend-api 具有获取模板并对其进行处理的代码,但 taac-web 是存储模板的位置(特别是在:WEB-INF/classes/email/vendor.tpl) - 我已经尝试过使用弹簧类路径资源使用 Freemarkers setClassForTemplateLoading 方法。我认为这会起作用:

    freemarkerConfiguration = new Configuration();
    freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
    Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl");

然而,我总是收到 FileNotFoundException。有人可以解释从类路径获取模板的最佳方法吗?

谢谢。

【问题讨论】:

【参考方案1】:

这就是最终对我有用的东西:

freemarkerConfiguration = new Configuration(Configuration.VERSION_2_3_28);
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");

【讨论】:

请假设“email/vendor.tpl”在哪里?【参考方案2】:

2017 年,以下内容已弃用:

Configuration conf = new Configuration();

我们应该将freemarker.template.Version 传递给构造函数:

Configuration conf = new Configuration(new Version(2, 3, 23));
conf.setClassForTemplateLoading(Application.class, "/views");

版本号指的是 FreeMarker 的当前版本。

views 目录位于src/main/resources

【讨论】:

【参考方案3】:
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");

使用这个方法从你的类所在的包中加载类,所以如果你的类是

org.foo.SomeClass 模板将在类路径的/org/foo 中查找。这使您的模板与使用/加载它们的类一起存储。

【讨论】:

但是如果我想将模板保存在资源/模板文件夹下,我该怎么做呢? @Aromal 找到解决方案了吗?【参考方案4】:

如果您使用的是 Struts 2 和 Conventions 插件,wuntee 的解决方案似乎不起作用:setClassForTemplateLoading 反过来创建了一个 ClassTemplateLoader 的实例,无论指定什么路径前缀,它都不会在 jar 中找到文件.

相反,创建StrutsClassTemplateLoader 的实例。 (我在其getTemplateLoader 方法中的FreemarkerManager 的自定义子类中执行此操作。)它不接受任何参数,所以大概它只知道Struts 和Conventions 是如何做事的。

【讨论】:

根据类加载器层次结构,有时必须仔细考虑您为ClassTemplateLoader 指定的类。通常最好使用ClassTemplateLoader 构造函数,该构造函数直接采用ClassLoader(而不是Class - 自2.3.22 起),然后传入Web 应用程序的线程上下文类加载器。【参考方案5】:

使用以下配置并将其放在应用程序属性中。

spring.freemarker.template-loader-path=

【讨论】:

以上是关于从类路径设置 freemarker 模板的主要内容,如果未能解决你的问题,请参考以下文章

freemarker设置模板路径问题

Spring mvc整合freemarker详解

Spring mvc整合freemarker详解

Spring mvc整合freemarker详解

Spring mvc整合freemarker详解

FreeMarker 当前日期比较