2012-01-19 65 views
19

それぞれ独自のアプリケーションコンテキストプロパティファイルを持ついくつかのモジュールがあるプロジェクトで作業しています。これらのプロパティをすべてロードして、Springによるプレースホルダ解決に使用できるようにしたいと考えています。Spring 3.0の複数のプロパティファイル

前の質問はこれを言及しており、これらのプロパティファイルが吹いせずにお互いを参照に渡ることができるように、各コンテキストでPropertyPlaceholderConfigurerを使用優先順位で注文してtrueにignoreUnresolveablePlaceholdersを設定する方法について説明します良いブログの記事hereがありますアップ。

しかし、私はいくつかのカスタムプレースホルダ解決(私が解析しているいくつかのyamlファイルから)でロードしているプロパティを使用できるようにしたいので、これは私の問題を解決しません。これには、PropertyPlaceholderHelperを使用する必要があります。これには、Propertiesオブジェクトが引数として必要です。

私の知る限り、潜在的な解決策は以下のとおりです。

1)すべてのプロパティは1つのプロパティBeanにファイルをマージします。これにより、PropertyPlaceholderConfigurer(Springの内部プレースホルダー解決用)を作成し、PropertyPlaceholderHelper(私のプレースホルダー解決用)で使用できます。

2)何らかの方法でPropertyPlaceholderHelperを設定して、私が先に進み、そのブログ記事のアドバイスに従えば、PropertyPlaceholderConfigurersが開催します。

残念ながら、私はこれらのいずれかを行う方法を考えることができません。どんな助けでも大歓迎です!

PSここではSpring 3.1が大きな助けになるようです...残念ながら、私たちはまだそれに移行する準備ができていないので、まだ私を解決する解決策が必要です!

****編集****

これまでの回答に感謝します。彼らは良い答えですが、私たちは現在、非コアモジュールからプロジェクトのコアモジュールを分離する過程にあるため、残念なことに私を助けません。つまり、コアモジュールとそのア​​プリケーションコンテキストは、プロパティファイルの名前をハードコーディングできません。迷惑なことに、Springのクラスパススキャンは壊れているように見えるので、 "classpath *:*。properties"タイプのワイルドカードはトップレベルプロジェクトではなく、個々のモジュールをビルドするときにのみ機能します(これは既知の問題です)。

次に、非コアモジュールで定義されたプロパティファイルを、コアモジュールで定義されている既存のプロパティファイルにマージする方法について説明します。現時点では私はBeanPostProcessorを先に進めています - これを行うためのよりシンプルでエレガントな方法があるのだろうかと思っています。コードスニペット後

おかげ

+0

私はあなたが少なくとも1つの一定のdirセグメントを提供する必要があると思うので、 'classpath *:* .properties'は動作しませんが' classpath *:config/*。properties'は実行されます。 – mrembisz

答えて

7

あなたは

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" id="corePlaceHolder"> 
    <property name="ignoreUnresolvablePlaceholders" value="true"/> 
    <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
    <property name="searchSystemEnvironment" value="true"/> 
    <property name="locations"> 
     <list> 
      <value>classpath*:config/*/config1/*.properties</value> 
      <value>classpath*:config/*/config2/*.properties</value> 
      <value>classpath*:config/*/config3/*.properties</value> 
      <value>classpath*:custom.properties</value> 
     </list> 
    </property> 
</bean>  

を始める必要がありますあなたは、設定がクラスパス

config 
    config1 
    a.properties 
    config2 
    b.properties 
    config3 
    c.properties 
custom.properties 
9

経由で到達可能であるあなたが収集することができます確認して階層を以下にプロパティファイルを格納することができます。複数のプロパティファイルを1つのBeanに簡単に追加できます。

<bean id="allProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> 
    <property name="singleton" value="true"/> 
    <property name="ignoreResourceNotFound" value="true"/> 
    <property name="locations"> 
    <list> 
     <value>classpath*:default.properties</value> 
     <value>classpath*:overrides.properties</value> 
     <value>file:${APP_HOME}/**/*.properties</value> 
    </list> 
    </property> 
</bean> 

この特定の例では、すべてのdefault.propertiesの上書きが収集されます。APP_HOMEのクラスパスとプロパティファイルのプロパティこれで、ProperyPlaceholderConfigurerまたはカスタムポストプロセッサーからこのBeanを参照できます。

6

これは、あなたがする必要があるすべてである:

<context:property-placeholder location="first.properties" order="0" ignore-unresolvable="true"/> 
<context:property-placeholder location="second.properties" order="0" ignore-unresolvable="true"/> 
<context:property-placeholder location="empty.properties" order="1"/> 

問題は単純で、プロパティ・プレースホルダーが、それは例外がスローされます、特定のプロパティに値が設定されていない場合は、他のプロパティのプレースホルダが存在しているにもかかわらず、 。すべてのproperty-placeholderが価値を提供する機会を持つように

ソリューションは、最後property-placeholderであり、すべての他人にignore-unresolvable="true"を設定しているかを知るためにorderを使用しています。マルチモジュールプロジェクトでは、最後のproperty-placeholderは空でも、フェールセーフデフォルトを提供することもできます。

注:すべてのproperty-placeholderをignore-unresolvable="true"に設定すると、になります。Springは例外をスローせずに書いたものを渡します。もちろん、それがString以外の何かになることを期待しているなら、フォーマット変換の間に確実にjava.lang.NumberFormatException: For input string: "${something}"のような催促を受けるでしょう。

注:特定のプロパティの値を持つのみ最初の(最も低いorderを有するもの)property-placeholderが使用されます。プロパティをオーバーライドする場合は、01またはproperty-overrideより大きいorderの範囲を使用します。

Spring 3.2.1でテストされていますが、上記のプロパティはすべて3.0に存在します。 JavaDoc of PropertyPlaceholderConfigurer

関連する問題