1

環境に依存するアクティブプロファイルホストを設定したいが、環境に依存しないフックを見つけることができない。アクティブなプロファイルを任意の環境にプログラムで設定する方法はありますか?

次の工場では、アプリケーションコンテキストを構築する前にアクティブプロファイルを設定します。

/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializer 

MyApplicationContextInitializer.java

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { 
    @Override 
    public void initialize(ConfigurableApplicationContext ca) { 
     ConfigurableEnvironment environment = ca.getEnvironment(); 
     environment.addActiveProfile("myHost"); 
    } 
} 

この例では、JUnitので模擬環境で実行されている場合は...

* Test.java

... 
@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
... 

...以下が記録されます。

... 
... RestControllerTests : The following profiles are active: myHost 
... 

が、プロファイルMYHOSTはアクティブではなく、デフォルトのプロファイルは、JUnitののコンテキストで使用されます!

VM引数を持つJavaアプリケーションとJUnitなどのテストが動作する...私は戦争パッケージ春ブート・スターター・ウェブアプリを使用して、プログラムプロファイルが設定され、どのような環境で使用しなければならない

-Dspring.profiles.active=myHost 

  • Javaアプリケーション
  • JUnitの
  • サーブレットコンテナ

プロファイルをに設定するにはどうすればよいですか?はどのような環境でも構いません。

プロファイルは現在のホスト名で設定されるため、VMの引数または環境変数は使用しません。

答えて

0

mainメソッドでアプリケーションを起動する前に、SpringApplication.setAdditionalProfiles(…​)を試してみることができます。

アクティブなプロファイルを選択するためにホスト/いくつかの変数などをチェックするカスタムクエリを使用できます。

ドキュメント参照:boot-features-programmatically-setting-profiles

EDIT:

あなたはあなたの目標を達成するためにConfigurableEnvironmentを使用しようとすることができます。

次のようにBeanFactoryPostProcessorを実装するクラスを作成します。あなたのポストプロセッサのための豆を登録すると

public class ConfigurableEnvironmentProcessor implements BeanFactoryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     ConfigurableEnvironment env = beanFactory.getBean(ConfigurableEnvironment.class); 
     // add custom code to get properties based on custom code 
    } 

} 

を:

@Bean 
public static BeanFactoryPostProcessor configurableEnvironmentProcessor() { 
    return new ConfigurableEnvironmentProcessor(); 
} 

方法はstaticするためのスプリングブーツを初期化するのでこれは重要ですこれらのメソッドは、コンフィグレーションクラスが完全に初期化される前に、staticに設定することで、クラスを完全に初期化せずに行うことができます。

+0

このソリューションは、Javaアプリケーションとしてのみ実行のために働きます'main'メソッドはサーブレットコンテナやJUnit-Testでは使われないからです。 –

+0

@mg。あなたに役立つかもしれない別のオプションで編集してください。 – Tom

+0

'postProcessBeanFactory'はアクティブなプロファイルが既に設定された後に呼び出されます。 oswcsGenericWebApplicationContext:リフレッシュするorg.s[email protected]2df6226d:起動日[..]のログを取得します。 。]; 'postProcessBeanFactory'の私のブレークポイントのコンテキスト階層のルートです。 –

0

私は同じ問題を抱えていましたが、最終的にActiveProfilesResolverインターフェイスを実装して解決しました。

public class MyActivateProfilesResolver implements ActiveProfilesResolver { 

    @Override 
    public String[] resolve(Class<?> testClass) { 
     // some code to find out your active profiles 
     return new String[] {"myHost"}; 
    } 
} 

をそして、あなたはこのようなあなたのリゾルバを使用してテストをリンクする必要があります:あなたのケースでは

あなたはこのような何かを行うことができ

@ActiveProfiles(resolver = MyActivateProfilesResolver.class) 
関連する問題