Devo codificare una logica diversa in base al diverso profilo di ambiente corrente. Come è possibile ottenere i profili attivi e predefiniti correnti da Spring?
Devo codificare una logica diversa in base al diverso profilo di ambiente corrente. Come è possibile ottenere i profili attivi e predefiniti correnti da Spring?
Risposte:
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
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
@Value("${spring.profiles.active}")
private String activeProfile;
Funziona e non è necessario implementare EnvironmentAware. Ma non conosco gli svantaggi di questo approccio.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@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.
Se non stai utilizzando l'autowiring, implementa semplicemente EnvironmentAware
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;
}
}