从类路径加载freemarker模板

时间:2012-03-14 12:18:24

标签: spring-mvc freemarker

我在类路径中加载了一个来自Spring MVCapplication的资源。

<bean id="myController" class="com.MyController">
        <property name="myTemplate" value="classpath:myTemplate.txt"/>

</bean>

我正在尝试使用此代码将其作为freemarker模板加载:

private Resource myTemplate;

...

Configuration cfg = new Configuration();
cfg.setClassForTemplateLoading(this.getClass(), "/");
Template tpl = cfg.getTemplate(myResource.getFilename());

但我一直在最后:java.io.FileNotFoundException:模板类路径:找不到myTemplate.txt。

我尝试实施wassuggested here然而它似乎没有帮助。

我唯一能找到的黑客就是从文件名字符串中删除“classpath:prefix”但我不想这样做

任何想法......?

1 个答案:

答案 0 :(得分:3)

所以你要说的是你不想从模板名称中删除"class:",而根据this question你不想教FreeMarker通过自定义{{{ 1}}。我的意思是,如果你禁止这些,还有什么可以解决这个问题?我只能建议你做最后一次;实现自定义TemplateLoader(一个只删除TemplateLoader前缀然后委托给"class:",或者更好的是,只委托给一个Spring ClassTemplateLoader。这就是你如何配置FreeMarker来做你想做的事情。实现自己的ResourceLoader

并不是一件极端的事情

更新:知道默认可能有用,FreeMarker模板名称语法和Spring的资源名称语法之间存在不匹配。根据Spring语法,您可以编写TemplateLoader"classpath:foo.ftl"。但FreeMarker假设方案部分总是以"classpath:/foo.ftl"结束,孤独的://:并不特别。因此,所有这些资源路径都将被视为相对路径,因此当前模板目录将在实际模板解析之前添加到它们之前。要解决此问题,从FreeMarker 2.3.22开始,您可以使用:/Configuration.setTemplateNameFormat(TemplateNameFormat.DEFAULT_2_4_0)中的template_name_format=DEFAULT_2_4_0),它会将Properties视为方案分隔符。