【问题标题】:Unable to load freemarker template using multipartResolver无法使用 multipartResolver 加载 freemarker 模板
【发布时间】:2012-03-29 02:41:14
【问题描述】:

我正在使用通过类路径在我的 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());

但是当我运行它时出现错误:Template classpath:myTemplate.txt not found

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

有什么想法吗...?

【问题讨论】:

    标签: spring-mvc freemarker


    【解决方案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 包装到 TemplateLoader 接口中并不难。 (从长远来看,这肯定比试图“欺骗” FreeMarker 加载带有临时 setDirectoryForTemplateLoading 之类的模板更容易和更强大。)

    【讨论】:

    • 我只创建了一次配置对象,这里显示的就是这样来尝试简化我正在尝试做的事情。我想缩小我的问题范围是:如何在 freemarker 中使用 Spring 资源文件作为模板
    • 据我所知,在 Spring 中有一个 ResourceLoader 可以将资源字符串解析为 Resource 对象。所以你应该实现一个TemplateLoader,它委托给ResourceLoader。 (当然,除非 Spring FreeMarker 支持已经实现了。)然后使用 cfg.setTemplateLoader(yourResourceTemplateLoader)
    • 我希望避免开发自己的 TemplateLoader。肯定有办法告诉 Freemarker 从类路径加载模板?
    • 有,但是 Spring 资源字符串并不总是以“classpath:”开头,而且谁知道 ClassLoader-s Spring 使用什么。所以我的猜测仍然是最简单和最干净的事情就是继续将ResourceLoader包装到TemplateLoader接口中。也许您已经花费了比干净解决方案更多的时间来寻找解决方法。
    猜你喜欢
    • 2013-03-18
    • 2013-01-09
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多