2012-03-12 48 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