如何在Spring MVC中禁用freemarker缓存

时间:2011-05-12 16:19:35

标签: caching spring-mvc freemarker

我正在使用带有freemarker视图的spring mvc v3,并且无法禁用缓存。 我试过在(spring-servlet.xml)的viewResolver元素中将cache设置为false但是没有用。

基本上我想在freemarker中做一些更改并在浏览器中看到这些更改只刷新(没有重新启动应用程序)

任何提示如何做到这一点?

8 个答案:

答案 0 :(得分:4)

在我的XML中,以下成功:

<bean id="freemarkerMailConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean">
    <property name="templateLoaderPaths" value="classpath:emailtemplates/task,classpath:emailtemplates/user"/>
    <!-- Activate the following to disable template caching -->
    <property name="freemarkerSettings" value="cache_storage=freemarker.cache.NullCacheStorage" />
</bean>

这是我的邮件配置,但freemarkerConfig也应该是有趣的四个。

答案 1 :(得分:2)

manual

定义
  

如果更改模板文件,FreeMarker将重新加载和   下次获得模板时,会自动重新解析模板   时间。但是,由于检查文件是否已更改可能是时间   消耗,有一个名为``update的配置级别设置   延迟''。这是自上次检查以来必须经过的时间   在FreeMarker检查之前,某个模板的更新版本   那又一次。 默认设置为5秒。如果你想看到   立即更改模板,将其设置为0.

搜索后,配置密钥位于freemarker.template.Configuration javadocs, at the setSetting(key, value) method。 因此,简而言之,只需将配置 template_update_delay 设置为 0 即可立即进行更改检测。

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
  <property name="freemarkerSettings">
        <props>
            <prop key="template_update_delay">0</prop>
            <prop key="default_encoding">UTF-8</prop>
        </props>
  </property>
</bean>

答案 2 :(得分:2)

我不使用配置 xml 配置的freemarker,但使用@Configuration注释类;因为我更喜欢Spring-Boot'风格。所以你可以像这样禁用freemarker的缓存:

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException
{
    FreeMarkerConfigurer configurer = new FreeMarkerConfigurer()
    {

        @Override
        protected void postProcessConfiguration(freemarker.template.Configuration config) throws IOException, TemplateException
        { 
            ClassTemplateLoader classTplLoader = new ClassTemplateLoader(context.getClassLoader(), "/templates"); 
            ClassTemplateLoader baseMvcTplLoader = new ClassTemplateLoader(FreeMarkerConfigurer.class, ""); //TODO tratar de acceder a spring.ftl de forma directa
            MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[]
            { 
                classTplLoader,
                baseMvcTplLoader
            });
            config.setTemplateLoader(mtl);
            config.setCacheStorage(new NullCacheStorage()); 
        }
    };
    configurer.setDefaultEncoding("UTF-8"); 
    configurer.setPreferFileSystemAccess(false);
    return configurer;
}

关键是:

  

config.setCacheStorage(new NullCacheStorage());

但您也可以使用此说明:

config.setTemplateUpdateDelayMilliseconds(0);

它应该适合你。

答案 3 :(得分:1)

答案 4 :(得分:1)

我浪费了最后两天(完全注意这个项目)试图禁用缓存。事实证明我在context.xml中设置了两个选项antiJARLocking和antiResourceLocking。然后模板将始终被缓存

答案 5 :(得分:1)

在application.properties中:

spring.freemarker.cache=false

答案 6 :(得分:0)

我有同样的问题,我只能通过实现自定义模板加载器来解决。这是工作代码:

protected void init() throws Exception {
    freemarkerConfig = new Configuration();
    freemarkerConfig.setObjectWrapper(ObjectWrapper.DEFAULT_WRAPPER);
    freemarkerConfig.setTemplateLoader(new CacheAgnosticTemplateLoader(new DefaultResourceLoader(), pdfTemplatePath));
}

protected static class CacheAgnosticTemplateLoader extends SpringTemplateLoader {
    public CacheAgnosticTemplateLoader(ResourceLoader resourceLoader, String templateLoaderPath) {
        super(resourceLoader, templateLoaderPath);
    }

    @Override
    public long getLastModified(Object templateSource) {
        // disabling template caching
        return new Date().getTime();
    }
}

答案 7 :(得分:0)

似乎在最近发布的FreeMarker版本2.3.17中,出现了一种合法且更简单的方法:freemarker.cache.NullCacheStorage