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;
}
}