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