我有一个Web应用程序需要手动获取Freemarker模板 - 模板是通过库项目中的类获得的,但实际的tpl文件包含在Web应用程序类路径中。因此,有2个项目,一个是“taac-backend-api”,另一个是“taac-web”; taac-backend-api有代码来获取模板并对其进行处理,但是taac-web是模板存储的地方(具体在:WEB-INF / classes / email / vendor.tpl) - 我已尝试过使用的一切使用Freemarkers setClassForTemplateLoading方法弹出classpath资源。我认为这样可行:
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("/email/vendor.tpl");
然而,我总是得到一个FileNotFoundException。有人可以解释从类路径获取模板的最佳方法吗?
感谢。
答案 0 :(得分:75)
最终为我工作的是:
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "/");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("email/vendor.tpl");
答案 1 :(得分:4)
freemarkerConfiguration = new Configuration();
freemarkerConfiguration.setClassForTemplateLoading(this.getClass(), "");
Template freemarkerTemplate = freemarkerConfiguration.getTemplate("template.tpl");
使用此方法从您的类所在的包中加载类,因此如果您的类是
org.foo.SomeClass
将在类路径的/org/foo
中查找模板。这使您的模板与使用/加载它们的类一起存储。
答案 2 :(得分:3)
2017年,不推荐使用以下内容:
myMessages
我们应该将Configuration conf = new Configuration();
传递给构造函数:
freemarker.template.Version
其中版本号指的是当前版本的FreeMarker。
Configuration conf = new Configuration(new Version(2, 3, 23));
conf.setClassForTemplateLoading(Application.class, "/views");
目录位于views
。
答案 3 :(得分:0)
如果您正在使用Struts 2和Conventions插件,wuntee的解决方案似乎不起作用:setClassForTemplateLoading
反过来创建ClassTemplateLoader
的实例,无论在什么内容都找不到jar中的文件路径前缀已指定。
而是创建StrutsClassTemplateLoader
的实例。 (我在其FreemarkerManager
方法中的getTemplateLoader
自定义子类中执行此操作。)它不需要任何参数,因此可能只知道Struts和约定是如何做的。
答案 4 :(得分:0)
使用以下配置并将其放在应用程序属性中。
spring.freemarker.template-loader-path=