我在类路径中加载了一个来自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”但我不想这样做
任何想法......?
答案 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
视为方案分隔符。