web-dev-qa-db-fra.com

spring i18n: problème avec plusieurs fichiers de propriétés

Mes messages.properties est vraiment un gros fichier. J'ai donc essayé de déplacer certaines propriétés de messages.properties vers un nouveau fichier, par exemple newmessages.properties et de mettre à jour la configuration XML du bean printanier avec les deux fichiers comme suit:

<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>

Cependant, je ne peux pas accéder aux propriétés définies dans le nouveau fichier de propriétés. Est-il vraiment possible de spécifier plusieurs fichiers de propriétés (pour une seule locale)?

20
Arjun

La propriété basenames (s à la fin) accepte un tableau de noms basiques:

Définissez un tableau de noms de base, chacun suivant la convention spéciale susmentionnée. Les ensembles de ressources associés seront vérifiés séquentiellement lors de la résolution d'un code de message.

@voir Java doc: ReloadableResourceBundleMessageSource.setBasenames

Vous ne devriez donc avoir qu’une seule source de messages, avec une liste de fichiers (essayez de les séparer par une virgule).

<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>
43
Ralph

Une autre façon propre de faire la même chose:

<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>
20
spgodara

Une solution alternative à celles déjà mentionnées serait d'utiliser la propriété parentMessageSource qui délègue la recherche de message au parent si ce dernier ne le trouve pas dans l'instance actuelle.

Dans votre cas, il vaut probablement mieux rester avec le tableau basenames. Avoir la source de message hiérarchique pourrait avoir plus de sens si les sources de message utilisaient des implémentations différentes. Par exemple. le second lit les messages de db.

Notez que dans ce cas, lorsque Spring trouve deux instances de MessageSource, la principale sera celle avec l'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>
1
David L.

Pour ceux (comme moi) à la recherche d'une solution de configuration Java:

    @Bean
    public MessageSource messageSource() {
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasenames("i18n/messages", "i18n/newmessages");
        return messageSource;
    }

jdoc: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/AbstractResourceBasedMessageSource.html#setBasenames-Java.lang.String...-

0
Himanshu Tyagi