複数のプロジェクト/モジュールで(PropertyPlaceholderConfigurerを介して)複数のプロパティファイルを使用する


104

現在、複数のプロジェクト/モジュールに分割されたアプリケーションを作成しています。たとえば、次のモジュールを見てみましょう。

  • myApp-DAO
  • myApp-jabber

各モジュールには、独自のSpringコンテキストxmlファイルがあります。DAOモジュールの場合、必要なdb接続パラメーターを含むプロパティファイルを読み取るPropertyPlaceholderConfigurerがあります。jabberモジュールには、jabber接続プロパティ用のPropertyPlaceHolderConfigurerもあります。

myApp-DAOとmyApp-jabberを含むメインアプリケーションが登場します。すべてのコンテキストファイルを読み取り、1つの大きなSpringコンテキストを開始します。残念ながら、コンテキストごとに1つのPropertyPlaceholderConfigurerしか存在できないようです。そのため、最初にロードされたモジュールは、その接続パラメーターを読み取ることができます。もう1つは「プレースホルダー 'jabber.host'を解決できませんでした」のようなエラーで例外をスローします

私は問題が何であるかをある程度理解していますが、私は本当に解決策、または私のユースケースのベストプラクティスを知りません。

各モジュールが独自のプロパティファイルをロードできるように、各モジュールをどのように構成しますか?現在、PropertyPlaceHolderConfigurerを個別のコンテキストファイルから移動し、メインアプリケーションのコンテキストにマージしました(単一のPropertyPlaceHolderConfigurerですべてのプロパティファイルをロードしています)。ただし、daoモジュールを使用するすべての人が、コンテキストにPropertyPlaceHolderConfigurerが必要であることを知っている必要があるため、これは厄介です。また、daoモジュールの統合テストも失敗します。

Stackoverflowコミュニティからの解決策やアイデアについて知りたいです。

回答:


182

関係する各コンテキストで、すべてのプレースホルダーが解決できないキーを無視していることを確認すると、これらのアプローチの両方が機能します。例えば:

<context:property-placeholder
location="classpath:dao.properties,
          classpath:services.properties,
          classpath:user.properties"
ignore-unresolvable="true"/>

または

    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:dao.properties</value>
                <value>classpath:services.properties</value>
                <value>classpath:user.properties</value>
            </list>
        </property> 
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
    </bean>

11
これらの問題をさらに解決するのに役立つはずの、件名に関する有用なエントリは次のとおりです。tarlogonjava.blogspot.com
Tim Hennekey

2
ありがとうございました!!ignore-unresolvable = "true"はまさに私が必要としたものであり、それでうまくいきました!
black666 2010

1
すべてのファイルを1つのタグで追加する場合は、イベントは必要ありませんignore-unresolvable="true"。それ以外の場合は必要です。
Eric Wang

の意味を説明できますignoreUnresolvablePlaceholdersか?解決できないプレースホルダーとは何ですか?
emeraldhieu 2015

PropertySourcesPlaceholderConfigurerSpring 3.1以降のデフォルトのバッキング実装であるためPropertyPlaceholderConfigurer、Bean実装クラスの代わりに使用するのが賢明です。
ジホル

18

これは古い質問であることは承知していますが、このignore-unresolvableホテルではうまくいかなかったため、理由がわかりませんでした。

問題は、外部リソース(などlocation="file:${CATALINA_HOME}/conf/db-override.properties")が必要でありignore-unresolvable="true"、この場合はが機能しないことでした。

不足している外部リソースを無視するために必要なことは次のとおりです。

ignore-resource-not-found="true"

他の誰かがこれにぶつかった場合に備えて。


3
ignore-unresolvableignore-resource-not-foundさまざまな目的を果たします。プロパティファイルが存在しない場合のエラーを防ぐには、を使用しますignore-resource-not-found="true"ファイルに存在しないプロパティを使用するときのエラーを防ぐには、を使用しますignore-unresolvable="true"。プロパティの一部のセットを含む複数のファイルがあり、各ファイルが存在する場合と存在しない場合は、両方を使用する必要があります。
datguy 14年

8

<context:property-placeholder />複数のPropertiesPlaceholderConfigurer Beanを明示的に宣言する代わりに、複数の要素を持つことができます。


2つの<context:property-placeholder />要素を使用してみましたが、指定されたプロパティを識別できないとSpringは不満を述べました。それが機能するためには、受け入れられた回答を実装する必要があります。
Mushy


2

以下の解決策を試しましたが、私のマシンで動作します。

<context:property-placeholder location="classpath*:connection.properties" ignore-unresolvable="true" order="1" />

<context:property-placeholder location="classpath*:general.properties" order="2"/>

Springコンテキストに複数の要素が存在する場合、いくつかのベストプラクティスに従う必要があります。

これらがSpringによって処理される順序を修正するためにorder属性を指定する必要がありますすべてのプロパティプレースホルダーから最後のものを除いたもの(最高の順序)はignore-unresolvable=”true”、例外をスローせずに解決メカニズムがコンテキスト内の他のものに渡せるようにする必要があります

ソース:http : //www.baeldung.com/2012/02/06/properties-with-spring/


注文指定は必要ですか?私はこれを試しました、そして、jvmは不平を言いました。
Mushy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.