2013-06-03 12 views
7

私は豆をロードするために春のプロファイルを持つ春3.1を使用しています。私のアプリのコンテキストファイルでは、私は次のようにプロパティをロードします。プロパティが複数のコンテキストで見つかりません:property-placeholder

<context:property-placeholder order="1" location="classpath*:META-INF/spring/*_${spring.profiles.active}.properties" ignore-unresolvable="true"/> 

そして私はそれが正常に動作します

<property name="driverClassName" value="${database.driverClassName}"/> 

などのデータソースBeanをロードするためにプロパティの値を使用します。 いくつかのデータベーステーブルのプロパティをロードできるように、2つ以上のプロパティプレースホルダを追加すると問題が発生します。

このプロパティを使用して、詳細に追加する

<bean id="configFactoryBean" 
class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean"> 
    <constructor-arg ref="globalSystemConfiguration"/> 
</bean> 

によってロード参照、このconfigFactoryBeanデータベースからプロパティをロードするdatasourceを使用します。

私はこれを行うと、私は次の例外があります

java.lang.ClassNotFoundException: ${database.driverClassName} 

私の分析では、その最初のコンテキストプロパティのプレースホルダからプロパティを解決する前にdatasourceをロードしようとしているということです。私は間違っているかもしれません。または、春のプロファイル変数が正しく解決されていない可能性があります。

誰でもこの問題を解決するのに手伝ってください。

おかげ Akki

+0

は、それが動作しません0 –

+0

号に順序を設定してみてください。私は最初の1つの順序を0に変更しても、同じエラーがあります。 – Abby

+0

ああ待って、あなたのデータベースドライバを見つけることができません。クラスパスに追加しましたか? –

答えて

1

コンフィギュレーションファイルの作品へのパスをハードコーディング示唆しているので、プロファイル設定を選択を含めるようにタグに属性を使用してみてください。

<beans profile="profileName"> 
    <context:property-placeholder order="1" location="classpath*:META-INF/spring/hardcoded.properties" ignore-unresolvable="true"/> 
</beans> 

<beans profile="profileName2">  
    <context:property-placeholder order="1" location="classpath*:META-INF/spring/hardcoded.properties" ignore-unresolvable="true"/> 
</beans> 

は、プロファイルを説明するこの記事を参照してください: http://java.dzone.com/articles/using-spring-profiles-xml

+0

それは私が他の2つのタグを削除する場合に機能します。それは私が推測するプロパティを解決することができません – Abby

+0

他の2つのプロパティプレースホルダには順序が指定されていますか? –

+0

はい彼らはそれぞれ1と2の順番を持っています – Abby

4

私のアプリケーションでは、私は方法を以下にプロパティ・プレースホルダー構成器を使用していますが、それは非常によく動作します。あなたはそれを試すことができます。

<bean id="propertyConfigurer" 
      class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
      <property name="locations"> 
      <list> 
       <value>classpath*:META-INF/spring/*_${spring.profiles.active}.properties</value> 
      </list> 
      </property> 
    </bean> 

これはあなたの問題を解決するはずです。 :)

4

<コンテキスト:プロパティ・プレースホルダー>はPropertyPlaceholderConfigurerの新しいインスタンスを作成します - それは簡単に厄介取得します。アプリケーションごとに1つ、アプリケーションレベルではライブラリの1つではなく、メンテナンスがずっと簡単です。詳細については

とここを見て、それに対処する方法を提案:複数のプロパティのプレースホルダについて http://rostislav-matl.blogspot.cz/2013/06/resolving-properties-with-spring.html

+0

新しいオーダーの再利用を作成したり、プロパティーソースのチェーンを維持する代わりに、この問題を解決するために 'order'属性が導入されました。現在https://jira.spring.io/browse/SPR-9989が開いています。 – gavenkoa

10

をこのバグは、あなたの問題に関連する可能性がありますhttps://jira.spring.io/browse/SPR-9989

と一緒に複数のPropertyPlaceholderConfigurerを使用する場合 @Valueプレースホルダ構文の注釈とデフォルト値(つまり、 ${key:defaultValue})は、最初のPropertyPlaceholderConfigurerのみが です。このコンフィグレーターに希望の値が含まれていない場合は、 PropertyPlaceholderConfigurerに値が含まれていても、 は@Valueに戻ります。

はバージョン/秒の影響:3.1.3

関連する問題