2012-02-13 7 views
80

Devo codificare una logica diversa in base al diverso profilo Ambiente corrente. Come si ottengono i profili attivi e predefiniti correnti da Spring?Come si ottiene il profilo ambientale attivo/predefinito corrente in primavera?

+0

avete bisogno di più dettagli di quello. – aweigold

+3

@aweigold: richiama automaticamente il profilo ambiente attivo/predefinito in primavera 3.1. quali ulteriori dettagli hai bisogno? – Bobo

+0

Ho offerto una modifica ... Non ho i diritti di modifica completa, annullerò il mio voto quando posso. – aweigold

risposta

123

È possibile autowire dell'Ambiente

@Autowired 
Environment env; 

ambiente offre String[] getActiveProfiles(), String[] getDefaultProfiles(), e boolean acceptsProfiles(String... profiles)

+2

Funziona anche con '@ Resource' (Spring 4.2) –

10

Se non si utilizza autowiring, è sufficiente implementare EnvironmentAware

14

Ecco un esempio più completo.

Autowire Ambiente

In primo luogo si vorrà autowire il fagiolo ambiente.

@Autowired 
private Environment environment; 

Verificare se i profili esistono in Profili attivi

Quindi è possibile utilizzare getActiveProfiles() per scoprire se il profilo esiste nell'elenco dei profili attivi. Ecco un esempio che prende lo String[] da getActiveProfiles(), riceve uno stream da quell'array, quindi utilizza i parametri di corrispondenza per verificare più profili (maiuscole e minuscole) che restituisce un valore booleano se esiste.

//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 simili utilizzo funzionalità di annotazione @Profile("local") Ecco ulteriori informazioni su questa tecnica: Spring Profiles

+1

@Profile sembra la soluzione migliore. –

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

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

+1

Questa riga fornisce questo errore: 'Causato da: java.lang.IllegalArgumentException: Impossibile risolvere il segnaposto 'spring.profiles.active' nel valore" $ {spring.profiles.active} "' – zygimantus

3

Estendere bella risposta semplice di User1648825 (non posso commentare e mia modifica è stata respinta):

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

Questo potrebbe generare un IllegalArgumentException se sono impostate alcun profilo (ottengo un valore nullo). Questa potrebbe essere una buona cosa se ne hai bisogno; se non utilizzare la sintassi di 'default' per @value, vale a dire:

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

... activeProfile ora contiene 'Unknown' se spring.profiles.active non può essere risolto

Problemi correlati