我有一個使用FreeMarker渲染視圖並提出以下問題的Spring MVC Web應用程序。Freemarker模板刷新後緩存共享變量
在我的FreeMarker配置中,我將Singleton Spring bean聲明爲FreeMarker變量,並且在我的應用程序中,我提供了用於動態刷新Singleton Bean的機制(該Bean包含從DB檢索的應用程序配置)。
現在的問題是,刷新時,以前渲染的FreeMarker模板會使用舊版本中的值,但如果導航到自從容器啓動以來未呈現的頁面,它將使用新值。
以下是我的FreeMarker配置的一個片段:
<!-- FreeMarker config -->
<bean id="freemarkerViewConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPaths">
<array>
<value>/WEB-INF/freemarker</value>
<value>classpath:/WEB-INF/freemarker</value>
</array>
</property>
<property name="freemarkerSettings">
<props>
<prop key="datetime_format">dd/MM/yyyy</prop>
<prop key="number_format">#</prop>
<prop key="whitespace_stripping">true</prop>
<prop key="auto_import">
spring.ftl as spring,
custom-macros.ftl as custom,
</prop>
</props>
</property>
<property name="freemarkerVariables">
<map>
<entry key="xml_escape" value-ref="fmXmlEscape"/>
<entry key="html_escape" value-ref="fmHtmlEscape"/>
<entry key="config" value-ref="config"/>
</map>
</property>
</bean>
要刷新的配置模式,我執行我的控制器類中的以下內容:
((XmlWebApplicationContext)applicationContext).refresh();
具有這種結構拿起刷新配置模型訪問尚未呈現的頁面,但不會識別已訪問頁面上的更改。
我曾嘗試以下強制執行的變量的「刷新」,沒有運氣:
在上下文之後,所述控制器刷新我清除已被自動裝配FreeMarker的配置內的templateCache:
freeMarkerConfig.getConfiguration()。clearTemplateCache();
我也曾嘗試使用freeMarkerSettings內的下列財產禁用FreeMarker的配置中的模板緩存:
freemarker.cache.NullCacheStorage
最後,它的值得指出的是,在當調試並查看緩存和配置,共享變量確實引用了最新的配置模型,但是頁面使用舊版本進行渲染。
有關如何解決此問題的任何建議/指導?
PS我使用Spring v3.1.1.RELEASE和FreeMarker也v2.3.19