2012-03-12 51 views
0

我使用MultipartFile通过类路径在我的Spring MVC应用程序配置为加载Freemarker模板:无法使用multipartResolver

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 
     <property name="maxUploadSize" value="1000000"/> 
    </bean> 

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

    </bean> 

,我试图用的freemarker为了加载此templete:

public class MyController 
    { 
     private Resource myTemplate; 

     .... 

     Configuration cfg = new Configuration(); 
     Template tpl = cfg.getTemplate(myTemplate.getFilename()); 

但是当我运行它,我得到一个错误:模板类路径:myTemplate.txt没有找到

我试着使用:cfg.setDirectoryForTemplateLoading(myTemplate.getFile().getParentFile())来确定目录,但这也没有帮助。

任何想法......?

回答

1

从引用的错误消息我想myTemplate.getFilename()返回classpath:myTemplate.txt而不是myTemplate.txt。即使将模板目录设置为myTemplate.getFile().getParentFile(),这也可能会导致为什么它不起作用。

但是这里最根本的问题是你似乎滥用FreeMarker API。正常情况下,应该在应用程序生命周期中创建一次对象Configuration。这是其中之一,因为它包含模板缓存。如果您仍然不使用模板缓存,那么您也可以将模板加载到String中,并使用Template类构造函数创建Template。 (但是,如果它是#include-s或#import -s其他模板,那么FreeMarker将在内部调用cfg.getTemplate)。如果您想使用cfg.getTemplate(因此也使用缓存),那么可能应该使用理解这些Spring的TemplateLoader资源名称,然后将FreeMarker配置为使用该名称(cfg.setTemplateLoader(yourTemplateLoader))。我不知道Spring是否已经包含这样的事情,但总的来说,将存储API包装到接口中并不困难。 (从长远来看,它比试图“诱骗”FreeMarker以特别的方式加载模板setDirectoryForTemplateLoading等等更容易,更稳健)。

+0

我只创建一次配置对象,这在这里显示尝试并简化我想要做的事情。我想缩小我的问题将是:我如何使用Spring资源文件作为免费标记中的Templete – Joly 2012-03-13 08:30:01

+0

据我所知,在Spring中有一个'ResourceLoader',它可以将资源字符串解析为'Resource'对象。所以你应该实现一个代表“ResourceLoader”的'TemplateLoader'。 (当然,除非Spring FreeMarker支持已经实现了。)然后使用'cfg.setTemplateLoader(yourResourceTemplateLoader)'。 – ddekany 2012-03-13 09:19:28

+0

我希望避免开发自己的TemplateLoader。当然,有一种方法可以让Freemarker从类路径中加载模板? – Joly 2012-03-14 11:44:48