Come ottenere l'attuale profilo di ambiente attivo / predefinito a livello di codice a primavera?


155

Devo codificare una logica diversa in base al diverso profilo di ambiente corrente. Come è possibile ottenere i profili attivi e predefiniti correnti da Spring?


3
@aweigold: ottenere il profilo di ambiente attivo / predefinito corrente programmaticamente nella primavera 3.1. di quali altri dettagli hai bisogno?
Bobo,

Risposte:



75

Estendere la bella semplice risposta dell'utente 1648825 (non posso commentare e la mia modifica è stata respinta):

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

Questo potrebbe generare un'eccezione IllegalArgumentException se non viene impostato alcun profilo (ottengo un valore null). Questa potrebbe essere una buona cosa se ne hai bisogno per essere impostata; in caso contrario utilizzare la sintassi "predefinita" per @Value, ovvero:

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

... activeProfile ora contiene "Sconosciuto" se non è stato possibile risolvere spring.profiles.active


I nomi dei profili sono separati da una virgola. Acquista baeldung.com/spring-profiles#2-using-springactiveprofile
Jason

56

Ecco un esempio più completo.

Ambiente autowire

Per prima cosa vorrai autowire il bean di ambiente.

@Autowired
private Environment environment;

Controlla se i profili esistono nei profili attivi

Quindi è possibile utilizzare getActiveProfiles()per scoprire se il profilo esiste nell'elenco dei profili attivi. Ecco un esempio che prende il String[]da getActiveProfiles(), ottiene uno stream da quell'array, quindi usa i matcher per controllare più profili (senza distinzione tra maiuscole e minuscole) che restituiscono un valore booleano se esistono.

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

È inoltre possibile ottenere funzionalità simili utilizzando i @Profile("local")profili di annotazione che consentono la configurazione selettiva in base a un parametro passato o ambiente. Ecco ulteriori informazioni su questa tecnica: profili di primavera


2
@Profile sembra la soluzione migliore.
Paul Waldo,

Sono accecato da linee separate per ogni parentesi graffa. Non standard di codifica Java.
user1567291

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

Funziona e non è necessario implementare EnvironmentAware. Ma non conosco gli svantaggi di questo approccio.


3
Questa riga fornisce questo errore:Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

Funziona perfettamente per me. Utilizzando Spring Boot 1.5.15.
рüффп

Penso che se il profilo è definito, il valore verrà analizzato, altrimenti si verifica l'eccezione. Non adatto a tutte le situazioni.
WesternGun

1
Anche il profilo attivo potrebbe essere un array, attenzione per favore. In tal modo è possibile ottenere errori imprevisti durante l'aggiunta di profili aggiuntivi.
Alex Efimov

Lo svantaggio di questo approccio è che non otterrà tutti i profili che Spring potrebbe prendere in considerazione durante la valutazione @Profile. Le app possono anche utilizzare la spring.profiles.include proprietà e possono impostare i profili a livello di codice durante l'inizializzazione tramite ConfigurableEnvironment. Environment.getActiveProfiles()otterrà l'elenco completo dei profili impostati utilizzando uno di questi meccanismi.
Scott Frederick,

14

Se non stai utilizzando l'autowiring, implementa semplicemente EnvironmentAware


0

Sembra che ci sia qualche richiesta per poter accedere a questo staticamente.

Come posso ottenere tale cosa in metodi statici in classi non gestite da primavera? - Etero

È un trucco, ma puoi scrivere la tua classe per esporla. È necessario prestare attenzione per assicurarsi che nulla chiamerà SpringContext.getEnvironment()prima che tutti i bean siano stati creati, poiché non vi è alcuna garanzia in merito all'istanza di questo componente.

@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;
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.