Ich muss unterschiedliche Logik basierend auf unterschiedlichen aktuellen Umgebungsprofilen codieren. Wie können Sie die aktuellen aktiven und Standardprofile von Spring abrufen?
Ich muss unterschiedliche Logik basierend auf unterschiedlichen aktuellen Umgebungsprofilen codieren. Wie können Sie die aktuellen aktiven und Standardprofile von Spring abrufen?
Antworten:
Sie können das automatisch verdrahten Environment
@Autowired
Environment env;
Environment
bietet an:
Erweitern der netten einfachen Antwort von User1648825 (Ich kann keinen Kommentar abgeben und meine Bearbeitung wurde abgelehnt):
@Value("${spring.profiles.active}")
private String activeProfile;
Dies kann eine IllegalArgumentException auslösen, wenn keine Profile festgelegt sind (ich erhalte einen Nullwert). Dies kann eine gute Sache sein, wenn Sie es einstellen müssen; Wenn nicht, verwenden Sie die 'Standard'-Syntax für @Value, dh:
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
... activeProfile enthält jetzt 'Unbekannt', wenn spring.profiles.active nicht aufgelöst werden konnte
Hier ist ein vollständigeres Beispiel.
Autowire-Umgebung
Zuerst möchten Sie die Umgebungs-Bean automatisch verdrahten.
@Autowired
private Environment environment;
Überprüfen Sie, ob Profile in aktiven Profilen vorhanden sind
Anschließend können Sie getActiveProfiles()
herausfinden, ob das Profil in der Liste der aktiven Profile vorhanden ist. Hier ist ein Beispiel, das das String[]
from verwendet getActiveProfiles()
, einen Stream von diesem Array abruft und dann Matcher verwendet, um nach mehreren Profilen zu suchen (ohne Berücksichtigung der Groß- und Kleinschreibung), die einen Booleschen Wert zurückgeben, falls vorhanden.
//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();
}
Sie können ähnliche Funktionen auch mithilfe der Anmerkungsprofile erzielen, die @Profile("local")
eine selektive Konfiguration basierend auf einem übergebenen oder Umgebungsparameter ermöglichen. Hier finden Sie weitere Informationen zu dieser Technik: Federprofile
@Value("${spring.profiles.active}")
private String activeProfile;
Es funktioniert und Sie müssen EnvironmentAware nicht implementieren. Aber ich kenne keine Nachteile dieses Ansatzes.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Apps können die spring.profiles.include
Eigenschaft auch verwenden und Profile während der Initialisierung mithilfe programmgesteuert festlegen ConfigurableEnvironment
. Environment.getActiveProfiles()
Sie erhalten die vollständige Liste der Profile, die mit einem dieser Mechanismen festgelegt wurden.
Wenn Sie kein Autowiring verwenden, implementieren Sie es einfach EnvironmentAware
Es scheint eine gewisse Nachfrage zu bestehen, um statisch darauf zugreifen zu können.
Wie kann ich so etwas in statischen Methoden in nicht vom Frühling verwalteten Klassen erhalten? - Äther
Es ist ein Hack, aber Sie können Ihre eigene Klasse schreiben, um es aufzudecken. Sie müssen darauf achten, dass nichts aufgerufen wird, SpringContext.getEnvironment()
bevor alle Beans erstellt wurden, da keine Garantie dafür besteht, wann diese Komponente instanziiert wird.
@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;
}
}