web-dev-qa-db-ja.com

Spring i18n:複数のプロパティファイルの問題

私のmessages.propertiesは本当に大きなファイルです。そこで、messages.propertiesのいくつかのプロパティを新しいファイル、たとえばnewmessages.propertiesに移動し、次のように両方のファイルでSpringBean構成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>

しかし、新しいプロパティファイルで定義されているプロパティにアクセスできません。 (単一のロケールに対して)複数のプロパティファイルを指定することは本当に可能ですか?

21
Arjun

ベース名(最後にs)プロパティは、ベース名の配列を受け入れます。

ベース名の配列を設定します。各ベース名は、上記の特別な規則に従います。メッセージコードを解決するときに、関連するリソースバンドルが順番にチェックされます。

@see Java doc: ReloadableResourceBundleMessageSource.setBasenames

したがって、リストファイルを含むメッセージソースは1つだけにする必要があります(コンマで区切るようにしてください)。

<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

同じことを行う別のクリーンな方法:

<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

すでに述べたものの代替ソリューションは、現在のインスタンスでメッセージルックアップが見つからない場合にメッセージルックアップを親に委任するプロパティparentMessageSourceを使用することです。

あなたの場合、おそらくbasenames配列のままにしておく方が良いでしょう。メッセージソースが異なる実装を使用している場合は、階層的なメッセージソースを使用する方が理にかなっています。例えば。 2番目はdbからのメッセージを読み取ります。

この場合、SpringがMessageSourceの2つのインスタンスを検出すると、プライマリインスタンスは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>
2
David L.

それら(私のような)のために、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 ...-

1
Himanshu Tyagi