无法使用multipartResolver加载freemarker模板

时间:2012-03-12 17:02:47

标签: spring-mvc freemarker

我正在使用我的Spring MVC应用程序中通过类路径配置的MultipartFile:

<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来加载这个模板:

    public class MyController
    {
        private Resource myTemplate;

        ....

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

但是当我运行它时,我收到一个错误:模板类路径:找不到myTemplate.txt

我尝试使用:cfg.setDirectoryForTemplateLoading(myTemplate.getFile().getParentFile())来确定目录,但这也无济于事。

任何想法......?

1 个答案:

答案 0 :(得分:1)

根据引用的错误消息,我认为myTemplate.getFilename()会返回classpath:myTemplate.txt,而不是myTemplate.txt。即使你将模板目录设置为myTemplate.getFile().getParentFile(),这也会使它失效。

但这里更基本的问题是你似乎滥用了FreeMarker API。通常,应在应用程序生命周期中创建一次Configuration对象。这是因为它包含模板缓存。如果您还没有使用模板缓存,那么您也可以将模板加载到String中,并使用Template类构造函数创建Template。 (但是,如果它是#include - s或#import - 其他模板,那么FreeMarker将在内部调用cfg.getTemplate。)如果您想使用cfg.getTemplate(从而也可以使用一个TemplateLoader来理解那些Spring资源名称,然后配置FreeMarker使用它(cfg.setTemplateLoader(yourTemplateLoader))。我不知道Spring是否已经包含这样的东西,但一般来说,将存储API包装到TemplateLoader接口并不困难。 (从长远来看,它比使用ad-hoc setDirectoryForTemplateLoading等“加速模板”加载模板更容易,更强大。)