2016-10-19 6 views
0

別のjarを依存関係として使用するSpring管理アプリケーションがあります。これは、プロパティファイルプロパティが依存関係jar(Spring 3/XML)内に埋められない

から注入された値を使用する必要があるSpring管理サービスクラス

Springコンテキストセットアップ

​​

public class SomeClass { 
    private ServiceFromTheOtherJar serviceFromTheOtherJar; 

    public SomeClass(ServiceFromTheOtherJar serviceFromTheOtherJar) { 
    this.serviceFromTheOtherJar = serviceFromTheOtherJar; 
    } 

    public void someMethod() { 
    serviceFromTheOtherJar.call(); 
    ... 

APPLIC依存ジャーからサービスを呼び出すクラスの主なアプリケーション依存するJAR

public class ServiceFromTheOtherJar { 

    private String someFieldWeWantToFillFromPropertyFile; 

    public void setSomeFieldWeWantToFillFromPropertyFile(String someFieldWeWantToFillFromPropertyFile) { 
    this.someFieldWeWantToFillFromPropertyFile = someFieldWeWantToFillFromPropertyFile; 
    } 

    public void call() { 
    //we would like to use the filled someFieldWeWantToFillFromPropertyFile here 
    ... 

でメインアプリ

<bean name="serviceFromTheOtherJar" class="com...ServiceFromTheOtherJar"/> 

<bean name="someClass" class="com...SomeClass"> 
    <constructor-arg ref="serviceFromTheOtherJar"/> 
</bean> 

サービスクラスのationContext.xmlそしてもちろん、我々は依存ジャーの中application.propertiesファイルを持っている、それは我々のプロパティ値が含まれていますsomeFieldWeWantToFillFromPropertyFileに注入したい

これで、依存するjarをメインアプリケーションに依存として追加することができます。メインアプリケーションが実行されているときにSpringのコンテキストが正しく設定され、ServiceFromTheOtherJar.call()メソッドが期待通りに呼び出されます。しかしsomeFieldWeWantToFillFromPropertyFileは、我々はこれまでに試したどんなプロパティファイルから充填されません(例えば@PropertySource({ "application.properties"})などEnvironment.getProperty(...))

制限

  • 私たちは両方のjarファイルでSpring 3のバージョンを持っていますが、これはデプロイメント環境のために残さなければなりません。そのため、Spring 4のソリューションは問題ありません。

  • 上記のように、メインアプリケーションは現在GenericXmlApplicationContextを使用しており、これを変更するとアプリケーションの重要な書き換えを示すように見えます。従って、例えば。それはあなたがapplicationContext.xmlをに次のBeanを追加する必要がプロパティファイルから値を読み取るには、実行して、コンテキストセットアップ時に

答えて

1

をBeanCreationExceptionが発生したため、ServiceFromTheOtherJarに@Serviceアノテーションを使用することはできないように見えました。 application.propertiesファイルを想定し

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations" value="classpath:application.properties" /> 
</bean> 

は、サービスBeanの定義を探します。この

<bean name="serviceFromTheOtherJar" class="com...ServiceFromTheOtherJar"> 
    <property name="someFieldWeWantToFillFromPropertyFile" value="${myValue}" /> 
</bean> 

今春のような拡張により、必要があります。この

myValue=Hello World 

のような定義が含まれていますクラスパス内のapplication.properties-fileを開き、myValueに従ってサービスBeanの属性を設定します。

+0

ありがとうございます。しかし、それは建築/ swの原則の観点からもOKであるのだろうか?ここでは、メインjarが依存関係jarのプロパティファイルにアクセスし、注入を管理することを意味します。私はそれがすべて依存関係jar内で処理されるアノテーションソリューションを見つけました。独自のConfiguration/ComponentScanファイルを持ち、ServiceクラスはValueを使ってインジェクションを管理します。残念ながら、私は実際のXMLソリューションを理解できませんでした。例えばmain jarは、サービスBeanとプロパティのインジェクションを宣言する依存関係jar自身のXMLコンテキストをインポートできますが、実行中にインジェクションは発生しません。 – hammerfest

+0

サービスBeanのコンテキストとプロパティを読み取るためのその他のBeanを定義することは可能です依存関係jarにある独自のxmlファイル(service-context.xml)に格納します。メインコンテキストを定義するファイルには、 ''を含む他のファイルを含めることができます。 – jaysee

+0

はい、これは前のコメントで試したものの、何らかの理由で働いていないものです。それはコンパイルされ、コンテキストビルドは成功ですが、実行中にプロパティ値が注入されません。 – hammerfest

関連する問題