从类路径设置 freemarker 模板
我有一个 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这就是最终对我有用的东西:
this is what ended up working for me:
在 2017 年,以下内容已被弃用:
我们应该将
freemarker.template.Version
传递给构造函数:其中版本号指的是 FreeMarker 的当前版本。
views
目录位于src/main/resources
中。In 2017, the following is deprecated:
We should pass
freemarker.template.Version
to the constructor:where the version numbers refer to the current version of FreeMarker.
The
views
directory is located insrc/main/resources
.使用此方法从类所在的包中加载类,因此如果您的类是
org.foo.SomeClass ,则将在
/org/foo
在类路径中。这将使您的模板与使用/加载它们的类一起存储。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.如果您使用的是 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 ofClassTemplateLoader
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 ofFreemarkerManager
in itsgetTemplateLoader
method.) It takes no parameters, so presumably it just knows how Struts and Conventions do things.使用以下配置并将其放置在应用程序属性中。
Use the following config and place it in application properties.