私は、依存性注入を利用するために、 を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
注釈で認識された ではありません。
私は通常、プロパティファイルまたはクラウド設定で実行するので、この方法でプロパティをロードしていませんが、クラス自体だけでなく、MySdkのインスタンスをコンテキストに登録しないでください。 –
私は投稿を編集し、MySdkクラスも追加しました。私が持っている問題があるので、春が2つ以上の状況を処理する方法が奇妙に感じられます。おそらく、別のスプリングコンテキストでインスタンス化されている私のSDKのコンテキストは、私が気づいていない 'AnnotationConfigApplicationContext'の中でいくつかの魔法をします...私はこのSDK内のこのコンテキストを他のものから分離することを期待していましたが、春はあまりにも多くの魔法をしているようだ... –