2012-01-10 43 views
1

我需要在JBoss AS7上運行的已部署WAR的上下文中將我的Spring Web應用程序的i18n本地化屬性作爲ResourceBundle對象加載。在Spring中加載ResourceBundle對象

這裏的原因是我需要將ResourceBundle對象作爲參數提供給JasperReports以正確編譯報告。 JasperReports使用參數「REPORT_RESOURCE_BUNDLE」來處理帶有str()函數或$ R {}表達式綁定的報告中的國際化。此參數唯一接受的類型是ResourceBundle對象,因此是我的情況。

我在某些時候已經開始工作了,但是看起來JBoss堅持了一個陳舊的屬性版本,我認爲這是因爲在做了一個後,它不能再使用未修改的代碼找到ResourceBundle清理,打包並重新部署到項目上。

在春天我們已經配置爲MessageSource豆如下,即能成功地加載和使用屬性文件作爲資源包:

@Bean 
public MessageSource messageSource() { 
    ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource(); 
    String[] basenames = {"/WEB-INF/classes/messages/i18n/core_messages", 
         "/WEB-INF/classes/messages/i18n/mui_messages"}; 
    ms.setBasenames(basenames); 
    return ms; 
} 

我當前實現獲取資源包對象如下:

public ResourceBundle getBeanResourceBundle() { 
    Locale fromConfig = DEFAULT_LOCALE; 

    //Resolve Locale from a configuration service 

    ClassLoader cl = Thread.currentThread().getContextClassLoader(); 
    return ResourceBundle.getBundle("core_messages", fromConfig, cl); 
} 

它有問題使用this.getClassLoader()加載類,然後開始工作後,我改變從Thread.currentThread()加載。然而,現在clean:package:deploy已經無效了,我有合理的信息向我建議,它已停止實際加載新的「core_messages」ResourceBundle對象,因爲在已部署的應用程序中從未出現明顯的鍵值變化,因此很多部署已返回。

部署的結構化是建立通過行家如下:

核心模塊包作爲JAR即對於被打包成的WAR爲JBoss部署前端模塊的依賴關係。

上述方法中具有加載諸如ResourceBundle之類的東西的代碼位於Core模塊中。最終的WAR是試圖從其WEB-INF/classes/.. classpath解析文件的FrontEnd模塊之一。

我需要訪問哪個類加載器才能從相應的類路徑加載?

回答

0

Spring中的MessageSourceResourceBundle類是ResourceBundle的一個實現,它使用MessageSource來提供它的屬性。它可以通過MessageSource對象(Autowired)和Locale實例化。 MessageSource已經處理了我在應用程序中需要的東西,並且我只需要抓取一個可用的ResourceBundle,它也可以使用Locale。

public ResourceBundle getBeanResourceBundle() { 
    Locale fromConfig = DEFAULT_LOCALE; 

    //Resolve Locale from a configuration service 

    return new MessageSourceResourceBundle(ms, fromNodeConfig); //replace code in my question 
}