我想重新加载速度模板,因为它已经改变了。为此,我设置了以下内容,但是当我在META-INF/template/
内手动更改.vm文件时重新加载不起作用。
velocimacro.library.autoreload = true
[spring|file|class].resource.loader.cache = false
有什么想法吗?这是我的velocityEngine bean
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="classpath:META-INF/template/" />
<property name="preferFileSystemAccess" value="false" />
<property name="velocityProperties">
<props>
<prop key="spring.resource.loader.cache">false</prop>
<prop key="file.resource.loader.cache">false</prop>
<prop key="class.resource.loader.cache">false</prop>
<prop key="velocimacro.library.autoreload">true</prop>
<prop key="resource.loader">spring</prop>
<prop key="directive.foreach.counter.name">counter</prop>
<prop key="directive.foreach.counter.initial.value">0</prop>
<prop key="spring.resource.loader.class">
org.springframework.ui.velocity.SpringResourceLoader
</prop>
</props>
</property>
</bean>
答案 0 :(得分:6)
正如setResourceLoaderPath
doc所说:
请注意,无论如何都将启用资源缓存。使用文件资源加载器,将在访问时检查上次修改的时间戳以检测更改。 使用SpringResourceLoader,资源将永久缓存(例如,对于类路径资源)。
...
要强制使用SpringResourceLoader,即在任何情况下都不将路径解析为文件系统资源,请关闭“preferFileSystemAccess”标志。有关详细信息,请参阅后者的javadoc。
然后是setPreferFileSystemAccess
设置是否更喜欢文件系统访问以进行模板加载。 文件系统访问可以热检测模板更改。
如果启用此选项,VelocityEngineFactory将尝试将指定的“resourceLoaderPath”解析为文件系统资源(这也适用于扩展的类路径资源和ServletContext资源)。
默认为“true”。 将其关闭以始终通过SpringResourceLoader加载(即作为流,无需热模板更改检测),如果某些模板驻留在扩展类目录中而其他模板驻留在jar文件中,则可能需要这样做。
所以看起来有一些事情会导致这个问题。使用SpringResourceLoader
和classpath:
伪协议使Spring无限地缓存模板。最重要的是preferFileSystemAccess
被禁用,这确保永远不会通过文件系统访问模板。
答案 1 :(得分:2)
添加此属性可以解决此问题:
velocimacro.permissions.allow.inline.to.replace.global=true
使用下面的属性时遇到了同样的问题,但添加上面的属性使我能够自动重新加载:
velocimacro.library.autoreload=true
file.resource.loader.cache=false
答案 2 :(得分:1)
好的,我的velocityEngine bean设置如下:
<bean id="velocityConfig" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
<property name="resourceLoaderPath" value="/templates/"/>
<property name="velocityProperties">
<props>
<prop key="input.encoding">utf-8</prop>
</props>
</property>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
<property name="cache" value="false"/>
<property name="prefix" value=""/>
<property name="suffix" value=".xhtml"/>
<property name="contentType" value="text/html; charset=UTF-8" />
<property name="exposeSpringMacroHelpers" value="true"/>
</bean>
(假设您使用Spring框架,顺便说一下) 我没有任何缓存问题。但我使用configurer bean而不是beanfactory。试着调查一下。
而且有一些事情,这是微不足道的,但仍然......,您是否在修改模板后重新部署项目?
答案 3 :(得分:0)
我过去遇到过同样的问题,所以我写了这篇博文:Spring-mvc + Velocity + DCEVM
主要思想是至少在开发时使用它:
webapp.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
webapp.resource.loader.path = /WEB-INF/views/
webapp.resource.loader.cache = true
webapp.resource.loader.modificationCheckInterval = 2
我发现它比SpringResourceLoader更好用,因为现在在我的模板中我可以包含这样的内容:
#parse("/parts/header.vm")
标题的路径位于/WEB-INF/views/header.vm