Muszę zakodować inną logikę w oparciu o inny bieżący profil środowiska. Jak uzyskać bieżące aktywne i domyślne profile ze Springa?
java
spring
spring-profiles
Bobo
źródło
źródło
Odpowiedzi:
Możesz automatycznie podłączyć
Environment
Environment
oferuje:String[] getActiveProfiles()
,String[] getDefaultProfiles()
, iboolean acceptsProfiles(String... profiles)
źródło
Rozszerzam ładną, prostą odpowiedź użytkownika 1648825 (nie mogę komentować, a moja zmiana została odrzucona):
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 .:
... activeProfile zawiera teraz „Unknown”, jeśli nie można rozwiązać spring.profiles.active
źródło
Oto bardziej kompletny przykład.
Środowisko Autowire
Najpierw będziesz chciał automatycznie podłączyć fasolę środowiska.
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 pobieraString[]
fromgetActiveProfiles()
, 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ą.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źródło
Działa i nie musisz wdrażać oprogramowania EnvironmentAware. Ale nie znam wad tego podejścia.
źródło
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Aplikacje mogą również używać tejspring.profiles.include
właściwości i mogą programowo ustawiać profile podczas inicjowania przy użyciuConfigurableEnvironment
.Environment.getActiveProfiles()
otrzyma pełną listę profili ustawionych przy użyciu dowolnego z tych mechanizmów.Jeśli nie używasz autoprzewodowania, po prostu zaimplementuj
EnvironmentAware
źródło
Wygląda na to, że istnieje zapotrzebowanie na dostęp do tego statycznie.
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.źródło