Odpowiedzi:
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
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
@Value("${spring.profiles.active}")
private String activeProfile;
Działa i nie musisz wdrażać oprogramowania EnvironmentAware. Ale nie znam wad tego podejścia.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@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.
Jeśli nie używasz autoprzewodowania, po prostu zaimplementuj EnvironmentAware
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;
}
}