2012-03-14 159 views
0

我从classpath加载的aSpring MVCapplication中有一个资源。从类路径加载freemarker模板

<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但它似乎没有帮助。

我可以findso迄今唯一黑客是删除“类路径:从文件名前缀字符串,但我不想做

任何想法...

回答

3

所以你说的是什么?你不想从模板名称中删除"class:",并且根据this question你不想教FreeMarker通过定制的TemplateLoader来理解它。我的意思是,如果你禁止这些,还有什么可以解决这个问题呢?只能建议你做最后一个;实施自定义TemplateLoader(或者只删除"class:"前缀,然后委托给ClassTemplateLoader,或者,甚至更好,只是代表春季ResourceLoader)。这就是你如何配置FreeMarker来做你想做的事情。这不是什么极端的事情,实施你自己的TemplateLoader

更新:它可能通过有用知道默认有FreeMarker的模板名称语法和Spring的资源名语法不匹配。根据Spring语法,您可以编写"classpath:foo.ftl"或​​。但FreeMarker认为方案部分总是以://结尾,而孤独的::/没什么特别的。因此,所有这些资源路径将被视为相对路径,因此当前模板目录将在实际模板解析之前添加在它们之前。为了解决这个问题,由于FreeMarker 2.3.22,你可以使用Configuration.setTemplateNameFormat(TemplateNameFormat.DEFAULT_2_4_0)template_name_format=DEFAULT_2_4_0Properties),它确实认为:作为方案分隔符。

+0

我想你是对的,我会继续使用TemplateLoader – Joly 2012-03-20 12:24:41