2012-11-27 55 views
1

我有一個使用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(); 

具有這種結構拿起刷新配置模型訪問尚未呈現的頁面,但不會識別已訪問頁面上的更改。

我曾嘗試以下強制執行的變量的「刷新」,沒有運氣:

  1. 在上下文之後,所述控制器刷新我清除已被自動裝配FreeMarker的配置內的templateCache:

    freeMarkerConfig.getConfiguration()。clearTemplateCache();

  2. 我也曾嘗試使用freeMarkerSettings內的下列財產禁用FreeMarker的配置中的模板緩存:

    freemarker.cache.NullCacheStorage

最後,它的值得指出的是,在當調試並查看緩存和配置,共享變量確實引用了最新的配置模型,但是頁面使用舊版本進行渲染。

有關如何解決此問題的任何建議/指導?

PS我使用Spring v3.1.1.RELEASE和FreeMarker也v2.3.19

回答

0

不太一個解決方案,但我有固定我的問題,但它更是一個說實話的黑客。

我改變了代碼通過使用以下命令因此只有配置的bean被重新刷新我的配置:

((DefaultListableBeanFactory) beanFactory).destroySingleton("config"); 

然後通過而不管去除參考配置模型修改的freemarker的配置我試過我無法得到這個刷新。因此,我的問題的解決方案然後是修改BaseController,該應用程序中的每個控制器都擴展,將配置模型作爲@ModelAttribute公開,以便它可用於所有視圖。

正如我所說的並不真正解決潛在的問題,但我已經解決了我的問題,雖然以非正統的方式。