从类路径设置 freemarker 模板

发布于 2024-09-05 08:49:33 字数 624 浏览 5 评论 0原文

我有一个 Web 应用程序,需要手动获取 Freemarker 模板 - 该模板是通过库项目中的类获取的,但实际的 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。有人可以解释从类路径获取模板的最佳方法吗?

谢谢。

I have a web application that I need to manually obtain a Freemarker template - the template is obtained via a class in a library project, but the actual tpl file is contained in the web application classpath. So, there are 2 projects, one 'taac-backend-api' and another 'taac-web'; taac-backend-api has the code to grab the template, and process it, but taac-web is where the template is stores (specifically in: WEB-INF/classes/email/vendor.tpl) - I have tried everything from using springs classpath resource to using Freemarkers setClassForTemplateLoading method. I assume this would work:

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

yet, I always get a FileNotFoundException. Can someone explain the best way to obtain a template from the classpath?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

久伴你 2024-09-12 08:49:33

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

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

this is what ended up working for me:

freemarkerConfiguration = new Configuration(Configuration.VERSION_2_3_28);
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
只是我以为 2024-09-12 08:49:33

在 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 中。

In 2017, the following is deprecated:

Configuration conf = new Configuration();

We should pass freemarker.template.Version to the constructor:

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

where the version numbers refer to the current version of FreeMarker.

The views directory is located in src/main/resources.

滿滿的愛 2024-09-12 08:49:33
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");

使用此方法从类所在的包中加载类,因此如果您的类是

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

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

Use this method to load the classes from the package where your class is located, so if your class is

org.foo.SomeClass the templates will be looked for in /org/foo in the classpath. This keeps your templates stored with the class that uses/loads them.

枕头说它不想醒 2024-09-12 08:49:33

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

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

If you are using Struts 2 and the Conventions plugin, wuntee's solution doesn't seem to work: setClassForTemplateLoading in turn creates an instance of ClassTemplateLoader which doesn't find files in jars no matter what path prefix is specified.

Instead, create an instance of StrutsClassTemplateLoader. (I do this in a custom sub-class of FreemarkerManager in its getTemplateLoader method.) It takes no parameters, so presumably it just knows how Struts and Conventions do things.

诗笺 2024-09-12 08:49:33

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

spring.freemarker.template-loader-path=

Use the following config and place it in application properties.

spring.freemarker.template-loader-path=
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文