現在、複数のプロジェクト/モジュールに分割されたアプリケーションを作成しています。たとえば、次のモジュールを取り上げます。
各モジュールには、独自の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コミュニティからソリューション/アイデアについて聞いてみたい。
関係する各コンテキストですべてのプレースホルダーが解決できないキーを無視していることを確認すると、これらのアプローチの両方が機能します。例えば:
<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>
これは古い質問であることは知っていますが、ignore-unresolvable
プロパティが機能していなかったので、理由がわかりませんでした。
問題は、外部リソース(location="file:${CATALINA_HOME}/conf/db-override.properties"
のようなもの)が必要であり、この場合ignore-unresolvable="true"
は役に立たないということでした。
不足している外部リソースを無視するために必要なことは次のとおりです。
ignore-resource-not-found="true"
誰かがこれにぶつかった場合に備えて。
複数のPropertiesPlaceholderConfigurer Beanを明示的に宣言する代わりに、複数の <context:property-placeholder />
要素を使用できます。
PropertiesPlaceholderConfigurer
Beanには、「propertiesArray」という代替プロパティがあります。 「プロパティ」プロパティの代わりにこれを使用し、プロパティ参照の<array>
で構成します。
私は以下の解決策を試しました、それは私のマシンで動作します。
<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/