Загрузка объекта ResourceBundle в Spring - PullRequest
1 голос
/ 11 января 2012

Мне нужно загрузить свойства локализации 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);
}

У него были проблемы с загрузкой класса с помощью этого.getClassLoader () и затем начал работать после того, как я перешел на загрузку из Thread.currentThread ().Тем не менее, теперь clean: package: deploy сделал это неэффективным, и у меня есть разумная информация, позволяющая предположить, что он фактически прекратил загрузку новых объектов "core_messages" ResourceBundle во многих развертываниях назад, потому что очевидные изменения значения ключа никогда не проявлялись в развернутом приложении.1013 *

Структурирование развертывания строится через maven следующим образом:

Базовые модули пакетов как JAR, которые являются зависимостью для модулей FrontEnd, которые упакованы как WAR-файлы для развертывания JBoss.

Код, который имеет сервисы для загрузки таких вещей, как ResourceBundle в приведенном выше методе, находится в модуле Core.Последняя WAR - это один из модулей FrontEnd, который пытается разрешить файлы из своего пути к классу WEB-INF / classes / ...

Какой загрузчик классов мне нужен для доступа к загрузке из соответствующего пути к классам?

1 Ответ

0 голосов
/ 13 января 2012

Класс 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
}
...