web-dev-qa-db-ja.com

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

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

  • 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コミュニティからソリューション/アイデアについて聞いてみたい。

98
black666

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

<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>
177
Tim Hennekey

これは古い質問であることは知っていますが、ignore-unresolvableプロパティが機能していなかったので、理由がわかりませんでした。

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

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

ignore-resource-not-found="true"

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

18
Raul Rene

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

8
earldouglas

PropertiesPlaceholderConfigurer Beanには、「propertiesArray」という代替プロパティがあります。 「プロパティ」プロパティの代わりにこれを使用し、プロパティ参照の<array>で構成します。

4
Stephen C

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

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

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

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

順序属性を指定して、これらがSpringによって処理される順序を修正する必要があります。すべてのプロパティプレースホルダから最後のものを引いたもの(最高の順序)にignore-unresolvable=”true”が必要です。例外

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

1
onurbaysan