2012-02-13 12 views
80

Potrzebuję kodować różne logiki w oparciu o inny bieżący profil środowiska. Jak uzyskać aktualne profile aktywne i domyślne ze Springa?Jak uzyskać programowo bieżący aktywny/domyślny profil środowiska na wiosnę?

+0

potrzebujesz więcej informacji niż to. – aweigold

+3

@aweigold: pobieraj bieżący aktywny/domyślny profil środowiska programowo wiosną 3.1. jakich więcej detali potrzebujesz? – Bobo

+0

Zaproponowałem zmianę ... Nie mam uprawnień do pełnej edycji, cofnę swój głos, kiedy będę mógł. – aweigold

Odpowiedz

123

Można autowire Środowiska

@Autowired 
Environment env; 

Środowisko oferuje String[] getActiveProfiles(), String[] getDefaultProfiles() i boolean acceptsProfiles(String... profiles)

+2

Działa również z '@ Resource' (wiosna 4.2) –

10

Jeśli nie używasz autowiring, wystarczy wdrożyć EnvironmentAware

14

Oto bardziej kompletny przykład.

Autowire Środowisko

Najpierw chcesz autowire fasoli środowiska.

@Autowired 
private Environment environment; 

Sprawdź, czy istnieje w Active Profile Profile

Następnie można użyć getActiveProfiles(), aby dowiedzieć się, czy profil istnieje na liście aktywnych profili. Oto przykład, który pobiera String[] z getActiveProfiles(), pobiera strumień z tej tablicy, a następnie używa dopasowań do sprawdzania wielu profili (Rozróżnianie wielkości liter), które zwracają wartość logiczną, jeśli istnieją.

//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(); 
} 

można również osiągnąć podobnego funkcjonalność adnotacji @Profile("local") Tu jest więcej informacji na temat tej techniki: Spring Profiles

+1

@Profile wydaje się najlepszym rozwiązaniem. –

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

To działa i nie trzeba wdrożyć EnvironmentAware. Ale nie znam wad tego podejścia.

+1

W tym wierszu występuje następujący błąd: 'Przyczyna: java.lang.IllegalArgumentException: Nie można rozwiązać symbolu zastępczego" spring.profiles.active "w wartości" $ {spring.profiles.active} "' – zygimantus

3

Rozszerzanie piękny prostą odpowiedź User1648825 za (nie mogę się wypowiedzieć, a moja edycja została odrzucona):

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

To może rzucać IllegalArgumentException jeśli nie profile są ustawione (otrzymuję wartość null). To może być Dobra Rzecz, jeśli chcesz ją ustawić; jeśli nie używać „default” składnię @Value, a mianowicie:

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

... activeProfile zawiera teraz „nieznane”, jeśli spring.profiles.active nie może być rozwiązany

Powiązane problemy