web-dev-qa-db-ja.com

Springでプログラム的に現在のアクティブ/デフォルトの環境プロファイルを取得するにはどうすればよいですか?

現在のさまざまな環境プロファイルに基づいて、さまざまなロジックをコーディングする必要があります。 Springから現在のアクティブおよびデフォルトのプロファイルを取得するにはどうすればよいですか?

121
Bobo

Environment を自動配線できます

@Autowired
Environment env;

Environmentが提供するもの:

177
aweigold

User1648825のニースの簡単な答えを拡張します(コメントできず、編集が拒否されました):

@Value("${spring.profiles.active}")
private String activeProfile;

これは、プロファイルが設定されていない場合にIllegalArgumentExceptionをスローする場合があります(null値を取得します)。設定する必要がある場合、これは良いことかもしれません。 @Valueに「デフォルト」構文を使用しない場合、つまり:

@Value("${spring.profiles.active:Unknown}")
private String activeProfile;

... spring.profiles.activeを解決できなかった場合、activeProfileに「不明」が含まれるようになりました

49
MartinMlima

以下に、より完全な例を示します。

Autowire Environment

まず、環境Beanを自動配線します。

@Autowired
private Environment environment;

アクティブなプロファイルにプロファイルが存在するかどうかを確認します

次に、getActiveProfiles()を使用して、アクティブなプロファイルのリストにプロファイルが存在するかどうかを確認できます。 getActiveProfiles()からString[]を取得し、その配列からストリームを取得し、マッチャーを使用して、存在する場合にブール値を返す複数のプロファイル(Case-Insensitive)をチェックする例を次に示します。

//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
   env -> (env.equalsIgnoreCase("test") 
   || env.equalsIgnoreCase("local")) )) 
{
   doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
   env -> (env.equalsIgnoreCase("prod")) )) 
{
   doSomethingForProd();
}

アノテーション@Profile("local")を使用して同様の機能を実現することもできます。この手法の詳細は次のとおりです。 Spring Profiles

37
anataliocs
@Value("${spring.profiles.active}")
private String activeProfile;

これは機能し、EnvironmentAwareを実装する必要はありません。しかし、私はこのアプローチの欠点を知りません。

23
user1648825

自動配線を使用していない場合は、EnvironmentAwareを実装するだけです

13
Arnout Engelen