2010-11-09 109 views
6

我希望能夠幫助解決我在Spring中涉及屬性文件的問題。因此設置我是像這樣:使用setBundle加載的屬性文件的重新加載

opto-mapping.properties - 這個位於我src文件夾中,幷包含像這樣我的優化資源翻譯:

generic-min.css=4037119659.css 

這個性的判定文件更新每次構建「優化」運行。然後我使用

<fmt:setBundle basename="opto-mapping" /> 

在我所需的jsp中導入我的屬性文件。然後使用引用內容:

<fmt:message key='generic-min.css' /> 

這一切精美的作品,除了屬性文件需要一個Tomcat重啓重新加載。我不希望每次更新資源時都必須開始關閉網站。我希望屬性文件能夠經常自動重新加載。

我的確嘗試更新我的spring-context.xml中的一個現有bean來重新加載這個屬性文件,就像我用翻譯做的一樣,但是這並沒有奏效 - 很可能是因爲opto-mapping.properties文件的位置 - 但你會發現它需要在該位置使用fmt:setBundle加載。

<bean id="messageSource" 
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="cacheSeconds"> 
      <value>1</value> 
     </property> 
     <property name="basenames"> 
      <list> 
       <value>WEB-INF/translations/translations</value> 
       <value>WEB-INF/classes/opto-mapping</value> 
      </list> 
     </property> 
</bean> 

任何幫助或在正確的方向點將不勝感激在這艱難的時刻。

我希望這一切都使senese和許多提前感謝!

G.

回答

1

有幾件事你可以嘗試。

<fmt:setBundle>最終會調用ResourceBundle.getBundle(String, Locale, ClassLoader),其中字符串將是您的基準名,並且類加載器將是Thread.currentThread().getContextClassLoader()。如果您使用的是JDK 1.6,則可以嘗試使用ResourceBundle.clearCache(ClassLoader)來清除軟件包緩存。在servlet過濾器中執行此操作並將其與某些其他邏輯結合以確定何時應清除高速緩存是有意義的。

另一個角度是更加直接地控制屬性文件的加載和JSTL的配置。再次,利用過濾器(忽略異常處理):

ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader(); 
URL propsURL = ctxLoader.getResource("opto-mapping.properties"); 
URLConnection propsConn = propsURL.openConnection(); 
long propsLastModified = propsConn.getLastModified(); 
// decide if you want to reload... 
propsConn.setUseCaches(false); 
InputStream propsIn = propsConn.getInputStream(); 
ResourceBundle propsBundle = new PropertyResourceBundle(propsIn); 
propsIn.close(); 
LocalizationContext propsCtx = new LocalizationContext(propsBundle); 
ServletContext servletCtx = this.filterConfig.getServletContext(); 
Config.set(servletCtx, Config.FMT_LOCALIZATION_CONTEXT, propsCtx); 

然後,你可以使用你的網頁<fmt:message>。您可以在JSTL API中找到LocalizationContextConfig的文檔。

許多其他變化是可能的,但一定要看一看較新的ResourceBundle(包括ResourceBundle.Control)添加到JDK 1.6,牢記「低級別」的API的功能,例如URLConnection,並熟悉JSTL的更多編程方面可通過其API獲得。

4

Tomcat不會重新加載類路徑上的資源。這是在規定的javadocReloadableResourceBundleMessageSource

由於應用服務器通常緩存從classpath加載的所有文件,有必要存儲資源在其他地方(例如,在網絡的「WEB-INF」目錄應用程序)。否則,類路徑中的文件更改將不會反映在應用程序中。

這樣的類路徑位置包括WEB-INF/classes,並且不會被釋放。

嘗試在其他地方(例如WEB-INF/messages)移動opto-mapping.properties,然後嘗試。

+0

太棒了,非常感謝您的反饋。我只是希望這不會導致我加載我的屬性文件(通過使用)的方式的問題。 – 2010-11-09 18:21:28

+0

明天我會去看看,並在這裏發表我的發現。謝謝! – 2010-11-09 18:21:59

5

謝謝你們的回覆。我現在有這個工作,並認爲我會分享財富。

所以,我將我的屬性文件移出src文件夾並放入WEB-INF/properties中。

我更新了以下bean來加載屬性文件:

<bean id="messageSource" 
     class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
     <property name="cacheSeconds"> 
      <value>1</value> 
     </property> 
     <property name="basenames"> 
      <list> 
       <value>WEB-INF/translations/translations</value> 
       <value>WEB-INF/properties/opto-mapping</value> 
      </list> 
     </property> 
    </bean> 

現在,以前我是用setBundle加載到我的屬性文件是這樣的:

<fmt:setBundle basename="opto-mapping" /> 

但是我發現,顯然我的屬性文件不再被加載,因爲我已經移動它。但由於我的bean設置新的屬性文件被加載,但我的setBundle覆蓋。

所以,解決方案是刪除setBundle,現在我的屬性文件重新加載!

再次感謝!