簡體   English   中英

在Spring中加載ResourceBundle對象

[英]Loading ResourceBundle object in Spring

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

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

我可以在某個時候使用它,但是似乎JBoss保留了舊版本的屬性,我相信以下事實可以澄清這一點:在執行干凈的打包后,它不再可以使用未經修改的代碼來定位ResourceBundle,並重新部署該項目。

在Spring中,我們如下配置了MessageSource Bean,它能夠成功加載和使用屬性文件作為資源束:

@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;
}

我當前用於獲取ResourceBundle對象的實現如下:

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對象加載回去,因為明顯的鍵值更改似乎從未在已部署的應用程序中發生更改。

部署的結構是通過maven構建的,如下所示:

核心模塊作為JAR打包,這是作為JBoss部署的WAR打包的FrontEnd模塊的依賴項。

上面的方法中具有用於加載諸如ResourceBundle之類的服務的代碼在Core模塊中。 最終的WAR是FrontEnd模塊之一,它試圖從其WEB-INF / classes / .. classpath中解析文件。

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

Spring中的MessageSourceResourceBundle類是ResourceBundle的實現,它使用MessageSource來提供其屬性。 可以使用MessageSource對象(自動裝配)和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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM