我有一个 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>
要刷新配置模型,我在 Controller 类中执行以下操作:
((XmlWebApplicationContext)applicationContext).refresh();
当访问尚未呈现但无法识别已访问页面上的更改的页面时,具有此配置会获取刷新的配置模型。
我尝试了以下方法来强制执行变量的“刷新”,但没有成功:
在上下文刷新后的控制器中,我清除了已自动装配的 FreeMarker 配置中的 templateCache:
freeMarkerConfig.getConfiguration().clearTemplateCache();
我还尝试使用 freeMarkerSettings 中的以下属性禁用 FreeMarker 配置中的模板缓存:
freemarker.cache.NullCacheStorage
最后,值得指出的是,在调试和查看缓存和配置时,共享变量确实引用了最新的配置模型,但页面使用旧版本呈现。
有关如何解决此问题的任何建议/指导?
ps 我正在使用 Spring v3.1.1.RELEASE 和 FreeMarker v2.3.19