2016-06-17 5 views
4

私は、依存性注入を利用するために、 をRESTバックエンドと統合するために使用されるSpringフレームワークを使用してSDKを作成しました。Spring 2つの異なるアプリケーションコンテキスト - プロパティプレースホルダの衝突

このSDKでは、を処理するMapPropertySourcesがあります。 基本的には、 を@Value注釈付きでSDK内で解決することをプログラムで登録しています。

これは、SDKの中に正常に動作しますが、私はSpring-bootアプリ内(ビルダを使用して)SDK を構築する際に、MapPropertiesPlaceHolder からのプロパティはもはや解決されません。

私は、ビルダークラスからのコードのこの部分を持っている:

public MyRepository build() { 


    AnnotationConfigApplicationContext context = 
      new AnnotationConfigApplicationContext(); 

    StandardEnvironment env = new StandardEnvironment(); 
    context.setEnvironment(env); 


    Map<String, Object> propertiesMap = new HashMap<>(); 
    propertiesMap.put("baseUrl", baseUrl); 

    MutablePropertySources mutablePropertySources = context.getEnvironment().getPropertySources(); 
    mutablePropertySources.addFirst(new MapPropertySource("customPropertiesMap", propertiesMap)); 


    if(jerseyClient == null){ 
     jerseyClient = JerseyClientBuilder.createClient(); 
    } 

    context.getBeanFactory().registerSingleton("jerseyClient", jerseyClient); 

    context.setParent(null); 
    context.register(MySdk.class); 
    context.refresh(); 

    MySdk mySdk = new MySSdk(context); 

    return mySdk; 
} 

これは私がSDKをインスタンス化し、私はその中に新しい Springコンテキストを作成する方法です。

問題は、私は別の spring-bootアプリケーションでMavenの依存関係としてSDKを使用する場合MapPropertySource 内のプロパティが解決されていないということです。それは親の コンテキストと何か関係がありますか?プロパティは解決されていません...どこで調べる必要がありますか?

短期間で、@Value('${baseUrl})がSDKのテストで解決されましたが、このSDKを別のspring-bootアプリケーションに組み込むと、それは解決されません。どうして?

編集:

MySdkクラスには、次のようになります。

@ComponentScan 
@Service 
@PropertySource("classpath:application.properties") 
public class DeviceRepository { 

    private ApplicationContext context; 

    public MySdk(){ 
    } 

    public MySdk(ApplicationContext context) { 
     this.context = context; 
    } 
    // other methods that calls beans from context like 
    // this.context.getBean(MyBean.class).doSomething() 

すべてが同じSDK内からのテストで正常に動作します。 baseUrlプロパティは正常に解決されましたが、別の スプリングアプリケーションにこのSDKを接続すると、プロパティはビルダーで渡され、@Value注釈で認識された ではありません。

+0

私は通常、プロパティファイルまたはクラウド設定で実行するので、この方法でプロパティをロードしていませんが、クラス自体だけでなく、MySdkのインスタンスをコンテキストに登録しないでください。 –

+0

私は投稿を編集し、MySdkクラスも追加しました。私が持っている問題があるので、春が2つ以上の状況を処理する方法が奇妙に感じられます。おそらく、別のスプリングコンテキストでインスタンス化されている私のSDKのコンテキストは、私が気づいていない 'AnnotationConfigApplicationContext'の中でいくつかの魔法をします...私はこのSDK内のこのコンテキストを他のものから分離することを期待していましたが、春はあまりにも多くの魔法をしているようだ... –

答えて

1

SpringコンフィグレーションでPropertySourcesPlaceholderConfigurer beanを定義しましたか? @Value注釈の中でプロパティの解決が失敗するたびに、これが思い浮かぶ最初のものの1つです。 Javadocを

@Bean 
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
} 

リンク:

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/PropertySourcesPlaceholderConfigurer.html

+0

これは間違った方向にデバッグしていた。私はあなたのために自動的にこの豆を作成すると思うが、春の起動と春のフレームワークだけを使用しない場合は、作成する必要があります。どのようにプロパティのソースのライフサイクルが正確かはわかりませんが、問題は私が最初に思ったような2つのスプリングコンテキストを持っていたためではありませんでした。 –

0

うーんだけで、プロパティのプレースホルダを使用してJavaの設定を活用に関する興味深い何かを読んで。このリンク#3をチェックしてください。別のBeanを登録する必要があるようです。

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

も注目に値する親コンテキスト対子供の全体範囲の議論があります。私はあなたがこの関係を作らなければ2つの文脈を持つことができるとは思わない。

関連する問題