Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Caching 如何在SpringMVC中禁用freemarker缓存_Caching_Spring Mvc_Freemarker - Fatal编程技术网

Caching 如何在SpringMVC中禁用freemarker缓存

Caching 如何在SpringMVC中禁用freemarker缓存,caching,spring-mvc,freemarker,Caching,Spring Mvc,Freemarker,我将SpringMVCv3与freemarker视图一起使用,无法禁用缓存。 我尝试在(springservlet.xml)中的viewsolver元素中将cache设置为false,但没有成功 基本上,我希望在freemarker中做一些更改,并在浏览器中仅使用刷新查看这些更改(不重新启动应用程序) 有什么提示吗?您是否检查了,其中包含一些关于如何在FreeMarker配置级别影响模板缓存的提示。我不确定您是否可以从Spring MVC内部访问FreeMarker配置对象,但如果可以,那么上面

我将SpringMVCv3与freemarker视图一起使用,无法禁用缓存。 我尝试在(springservlet.xml)中的viewsolver元素中将cache设置为false,但没有成功

基本上,我希望在freemarker中做一些更改,并在浏览器中仅使用刷新查看这些更改(不重新启动应用程序)


有什么提示吗?

您是否检查了,其中包含一些关于如何在FreeMarker
配置级别影响模板缓存的提示。我不确定您是否可以从Spring MVC内部访问FreeMarker
配置
对象,但如果可以,那么上面提到的文档页面可以为您指出一个可能的解决方案。

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

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();
    }
}

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

在我的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也应该让您感兴趣。

如以下定义:

如果更改模板文件,则FreeMarker将重新加载并 下一步获取模板时自动重新解析模板 时间但是,由于检查文件是否已更改,因此需要花费大量时间 使用时,有一个名为“更新”的配置级别设置 延迟“”。这是自上次检查以来必须经过的时间 FreeMarker之前的某个模板的更新版本将进行检查 再说一遍默认设置为5秒。如果你想看 如果要立即更改模板,请将其设置为0。

四处搜索后,配置密钥位于。 因此,简而言之,只需将config模板更新延迟设置为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>

0
UTF-8

我浪费了过去两天的时间(请注意本项目)试图禁用缓存。事实证明,我在context.xml中设置了两个选项:反jarlocking和反resourcelocking。然后模板将始终被缓存

我不使用xml配置,而是使用
@Configuration
注释类配置freemarker;因为我更喜欢弹簧靴的风格。因此,您可以如下方式禁用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(新的NullCacheStorage())

但您也可以使用此说明:

config.setTemplateUpdateDelayMilliseconds(0);

它应该适合您。

在application.properties中:

spring.freemarker.cache=false

有没有关于如何仅使用配置设置NullCacheStorage的示例?属性名称是
TemplateLoaderPath
,您将错过
s
。spring是否巧妙地将其转换为
templateLoaderPath
?它同时获得了templateLoaderPath和templateLoaderPath。看见