Подтвердить что ты не робот

Spring i18n: проблема с несколькими файлами свойств

Мои сообщения .properties - действительно большой файл. Итак, я попытался переместить некоторые свойства в messages.properties в новый файл, скажем, newmessages.properties и обновленный spring bean конфигурационный xml с обоими файлами следующим образом:

<bean id="messageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:i18n/messages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

<bean id="anotherMessageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:i18n/newmessages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

Но я не могу получить доступ к свойствам, указанным в новом файле свойств. Можно ли указать несколько файлов свойств (для одного языкового стандарта)?

4b9b3361

Ответ 1

Свойство basenames (s at the end) принимает массив базовых имен:

Установить массив базовых имен, каждый из которых соответствует вышеупомянутому специальному соглашению. Связанные пакеты ресурсов будут проверяться последовательно при разрешении кода сообщения.

@see java doc: ReloadableResourceBundleMessageSource.setBasenames

Итак, у вас должен быть только один источник сообщений с файлами списка (попробуйте разделить их запятой).

<bean id="anotherMessageSource"
      class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames" value="classpath:i18n/newmessages,classpath:i18n/messages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

Ответ 2

Еще один чистый способ сделать то же самое:

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>classpath:messages1</value>
                <value>classpath:messages2</value>
            </list>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
</bean>

Ответ 3

Альтернативное решение для уже упомянутых будет использовать свойство parentMessageSource, которое делегирует поиск сообщения родительскому объекту, если он не находит его в текущем экземпляре.

В вашем случае, вероятно, лучше остаться с массивом basenames. Наличие источника иерархического сообщения может иметь больше смысла, если источники сообщений используют разные реализации. Например. второй - чтение сообщений из db.

Обратите внимание, что в этом случае, когда Spring находит два экземпляра MessageSource, поэтому первичный будет с id MessageSource.

<bean id="messageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="parentMessageSource"><ref bean="anotherMessageSource"/></property>
    <property name="basename" value="classpath:i18n/messages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>

<bean id="anotherMessageSource"
  class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basename" value="classpath:i18n/newmessages"/>
    <property name="defaultEncoding" value="UTF-8"/>
</bean>