我正在使用带有freemarker视图的spring mvc v3,并且无法禁用缓存。 我试过在(spring-servlet.xml)的viewResolver元素中将cache设置为false但是没有用。
基本上我想在freemarker中做一些更改并在浏览器中看到这些更改只刷新(没有重新启动应用程序)
任何提示如何做到这一点?
答案 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
。