Springでプログラムによって現在のアクティブ/デフォルトの環境プロファイルをどのように取得しますか?


155

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


3
@aweigold:Spring 3.1でプログラムにより現在のアクティブ/デフォルトの環境プロファイルを取得します。詳細は何が必要ですか?
ボボ

回答:



75

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

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

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

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

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


プロファイル名はコンマで区切られます。チェックアウトbaeldung.com/spring-profiles#2-using-springactiveprofile
Jason

56

これは、より完全な例です。

Autowire環境

最初に、環境Beanを自動ワイヤリングする必要があります。

@Autowired
private Environment environment;

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

次に、を使用getActiveProfiles()して、アクティブなプロファイルのリストにプロファイルが存在するかどうかを確認できます。以下は、String[]from getActiveProfiles()を受け取り、その配列からストリームを取得し、マッチャーを使用して複数のプロファイル(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")プロファイルを使用して同様の機能を実現することもできます。プロファイルを使用すると、渡されたパラメーターまたは環境パラメーターに基づいて選択的に構成できます。このテクニックの詳細は次のとおりです。スプリングプロファイル


2
@Profileが最適なソリューションのようです。
ポールウォルド2017

中かっこごとに個別の線で目がくらんでいます。Javaコーディング標準ではありません。
user1567291

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

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


3
次の行はこのエラーを示しますCaused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
。– zygimantus

私にとっては完璧に機能します。Spring Boot 1.5.15の使用。
рüффп

プロファイルが定義されている場合、値が解析され、そうでない場合は例外が発生すると思います。すべての状況に適合するわけではありません。
WesternGun、

1
アクティブプロファイルも配列になる可能性があります。注意してください。このような方法を使用すると、プロファイルを追加するときに予期しないエラーが発生する可能性があります。
Alex Efimov

このアプローチの欠点は、Springが評価するときに検討するすべてのプロファイルを取得できないこと@Profileです。アプリはこのspring.profiles.include プロパティも使用でき、初期化中にを使用してプログラムでプロファイルを設定できますConfigurableEnvironmentEnvironment.getActiveProfiles()これらのメカニズムのいずれかを使用して設定されたプロファイルの完全なリストを取得します。
スコットフレデリック


0

これに静的にアクセスできるようにする必要があるようです。

スプリング管理されていないクラスの静的メソッドでそのようなことをするにはどうすればよいですか?–エーテル

これはハックですが、独自のクラスを作成して公開することができます。SpringContext.getEnvironment()このコンポーネントがいつインスタンス化されるかは保証されていないため、すべてのBeanが作成される前に何も呼び出されないように注意する必要があります。

@Component
public class SpringContext
{
    private static Environment environment;

    public SpringContext(Environment environment) {
        SpringContext.environment = environment;
    }

    public static Environment getEnvironment() {
        if (environment == null) {
            throw new RuntimeException("Environment has not been set yet");
        }
        return environment;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.