そのため、いくつかの記事では、contextInitializerClass 内で spring.profiles.active を構成する方法について説明しています。以下のようなものを web.xml に追加します。
<context-param>
<param-name>contextInitializerClasses</param-name>
<param-value>com.mycompany.SpringProfileInitializer</param-value>
</context-param>
そして対応するクラス:
public class SpringProfileInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
@Override
public void initialize(ConfigurableApplicationContext applicationContext) {
ConfigurableEnvironment environment = applicationContext.getEnvironment();
environment.setActiveProfiles( getActiveProfiles(NEED_PARAM_HERE) );
}
}
しかし、上記の getActiveProfiles() への呼び出しに引数を取得する必要があります。web.xml ファイルの「どこかに」ある限り、文字列だけで十分です。
これどうやってするの?
どうも。
編集:ステップをバックアップするために、私が実際に解決しようとしている問題は、1 つの JVM で実行されている複数の戦争の概念であり、それぞれが異なる spring.profiles.active プロパティを必要とし、さらに spring.profiles.active の値を必要としますいくつかのプロパティファイル内にあるenv固有になります。
明らかに、これは JVM に対してグローバルであるため、-Dspring.active.profilesは使用できません。env 固有の war ごとのプロパティ ファイルが既にあります。各 war は、 PropertyPlaceholderConfigurerを使用してこの prop ファイルを取り込む方法を知っています。この prop ファイルにspring.profiles.activeプロパティを追加しても機能しません (おそらく、処理が遅すぎます)。これらの戦争固有の小道具ファイルはすべて、戦争固有の名前で、ディスク上の既知の場所にインストールされることに注意してください。
これで、上記のようにApplicationContextInitializerを使用して 2 つの方法で問題を解決できます。
1)戦争ごとにApplicationContextInitializerを実装する新しいクラスを作成するだけで、実際の作業を行う「基本」クラスを拡張する可能性があります。class-per-war は、prop ファイルの名前をハードコーディングし、それを読み取り、spring.profiles.active プロパティを引き出すだけです。
2) 戦争全体で同じ名前の戦争固有の小道具ファイルを作成できます。これをspring-profile-loc.propertiesと呼びます。このファイルには、前述の war 固有の prop ファイルの名前であるプロパティが 1 つだけ含まれます。このシナリオでは、上記のSpringProfileInitializerクラスだけがあり、このspring-profile-loc.propertiesファイルを読み取り、単一のプロップを引き出し、実際のプロップ ファイルを読み取ってspring.profiles にアクセスします。アクティブな小道具 (このアイデアには他にもバリエーションがあります)。
私はどちらのアプローチも好きではありません。web.xml で何かを「構成」し、 ApplicationContextInitializerの実装で直接アクセスできれば、より簡単になります。
しかし、これを解決するためのまったく異なるアプローチがあれば、私はすべて耳にします。
どうも。