2012-01-10 2 views
1

Мне нужно загрузить свойства локализации i18n моего веб-приложения Spring в качестве объекта ResourceBundle в контексте развернутой WAR, запущенной на JBoss AS7.Загрузка объекта ResourceBundle весной

Причина в том, что мне нужно передать объект ResourceBundle в качестве параметра JasperReports для правильной компиляции отчетов. Параметр «REPORT_RESOURCE_BUNDLE» используется JasperReports для обработки интернационализации в отчетах с помощью функции str() или привязки выражения $ R {}. Единственным приемлемым типом для этого параметра является объект ResourceBundle, поэтому моя ситуация.

У меня было это в какой-то момент, но, похоже, JBoss держал устаревшую версию свойств, что, я считаю, было выяснено тем фактом, что он больше не мог найти ResourceBundle, используя немодифицированный код после того, как я сделал чистить, упаковывать и передислоцировать проект.

Весной мы настроили 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, который представляет собой зависимость для фронтэнда модулей, которые упакованы в WARS для развертывания JBoss.

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

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

ответ

0

Класс MessageSourceResourceBundle Spring - это реализация ResourceBundle, которая использует MessageSource для подачи своих свойств. Он может быть создан с помощью объекта MessageSource (Autowired) и локали. 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 
} 
Смежные вопросы