Jak programowo uzyskać bieżący aktywny / domyślny profil środowiska w Spring?

155

Muszę zakodować inną logikę w oparciu o inny bieżący profil środowiska. Jak uzyskać bieżące aktywne i domyślne profile ze Springa?

Bobo
źródło
3
@aweigold: pobierz bieżący aktywny / domyślny profil środowiska programowo wiosną 3.1. jakich więcej szczegółów potrzebujesz?
Bobo

Odpowiedzi:

75

Rozszerzam ładną, prostą odpowiedź użytkownika 1648825 (nie mogę komentować, a moja zmiana została odrzucona):

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

Może to spowodować zgłoszenie wyjątku IllegalArgumentException, jeśli żadne profile nie są ustawione (otrzymuję wartość null). Może to być Dobra Rzecz, jeśli chcesz ją ustawić; jeśli nie, użyj „domyślnej” składni dla @Value, tj .:

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

... activeProfile zawiera teraz „Unknown”, jeśli nie można rozwiązać spring.profiles.active

MartinMlima
źródło
Nazwy profili są oddzielone przecinkiem. Zamówienie baeldung.com/spring-profiles#2-using-springactiveprofile
Jason
56

Oto bardziej kompletny przykład.

Środowisko Autowire

Najpierw będziesz chciał automatycznie podłączyć fasolę środowiska.

@Autowired
private Environment environment;

Sprawdź, czy profile istnieją w aktywnych profilach

Następnie możesz użyć, getActiveProfiles()aby dowiedzieć się, czy profil znajduje się na liście aktywnych profili. Oto przykład, który pobiera String[]from getActiveProfiles(), pobiera strumień z tej tablicy, a następnie używa dopasowań do sprawdzenia wielu profili (bez rozróżniania wielkości liter), co zwraca 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żesz również osiągnąć podobną funkcjonalność, używając @Profile("local")profili adnotacji, które pozwalają na selektywną konfigurację na podstawie przekazanego parametru lub parametru środowiska. Tutaj jest więcej informacji na temat tej techniki: Profile sprężynowe

anataliocs
źródło
2
@Profile wydaje się najlepszym rozwiązaniem.
Paul Waldo,
Oślepiają mnie osobne linie dla każdego nawiasu klamrowego. Nie standardy kodowania Java.
user1567291
26
@Value("${spring.profiles.active}")
private String activeProfile;

Działa i nie musisz wdrażać oprogramowania EnvironmentAware. Ale nie znam wad tego podejścia.

user1648825
źródło
3
Ta linia podaje ten błąd:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus
U mnie działa idealnie. Używanie Spring Boot 1.5.15.
рüффп
Myślę, że jeśli profil jest zdefiniowany, wartość zostanie przeanalizowana, w przeciwnym razie powstanie wyjątek. Nie pasuje do wszystkich sytuacji.
WesternGun
1
Profil aktywny również może być tablicą, zwróć na to uwagę. Korzystając w ten sposób możesz otrzymać nieoczekiwany błąd przy dodawaniu kolejnych profili.
Alex Efimov
Wadą tego podejścia jest to, że nie otrzyma wszystkich profili, które Spring może wziąć pod uwagę podczas oceny @Profile. Aplikacje mogą również używać tej spring.profiles.include właściwości i mogą programowo ustawiać profile podczas inicjowania przy użyciu ConfigurableEnvironment. Environment.getActiveProfiles()otrzyma pełną listę profili ustawionych przy użyciu dowolnego z tych mechanizmów.
Scott Frederick,
14

Jeśli nie używasz autoprzewodowania, po prostu zaimplementuj EnvironmentAware

Arnout Engelen
źródło
0

Wygląda na to, że istnieje zapotrzebowanie na dostęp do tego statycznie.

Jak mogę uzyskać coś takiego w metodach statycznych w klasach zarządzanych przez wiosnę? - Aetherus

To hack, ale możesz napisać własną klasę, aby to ujawnić. Należy uważać, aby upewnić się, że nic nie zostanie SpringContext.getEnvironment()wywołane, zanim wszystkie ziarna zostaną utworzone, ponieważ nie ma gwarancji, kiedy wystąpi ten składnik.

@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;
    }
}
Michael
źródło