Загрузка объекта ResourceBundle в Spring
Мне нужно загрузить свойства локализации i18n моего веб-приложения Spring в качестве объекта ResourceBundle в контексте развернутой WAR, работающей на JBoss AS7.
Причина в том, что мне нужно передать объект ResourceBundle в качестве параметра JasperReports для правильной компиляции отчетов. Параметр "REPORT_RESOURCE_BUNDLE" используется JasperReports для обработки интернационализации в отчетах с помощью функции str() или привязки выражения $R{}. Единственным допустимым типом для этого параметра является объект ResourceBundle, поэтому моя ситуация.
В какой-то момент у меня это работало, но казалось, что JBoss держался за устаревшую версию свойств, что, как мне кажется, было объяснено тем фактом, что он больше не мог найти ResourceBundle с помощью неизмененного кода после того, как я сделал чистый пакет, и заново развернуть проект.
В Spring мы настроили компонент 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;
}
Моя текущая реализация для извлечения объекта 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, который является зависимостью для модулей FrontEnd, которые упакованы как WAR для развертывания JBoss.
Код, который имеет службы для загрузки таких вещей, как ResourceBundle в методе выше, находится в модуле Core. Последняя WAR - это один из модулей FrontEnd, который пытается разрешить файлы из своего пути к классу WEB-INF/classes/...
Какой загрузчик классов мне нужен для доступа к загрузке из соответствующего пути к классам?
1 ответ
Класс MessageSourceResourceBundle в Spring является реализацией 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
}