¿Cómo se obtiene el perfil de entorno activo/predeterminado actual mediante programación en Spring?

3 minutos de lectura

avatar de usuario
bobo

Necesito codificar una lógica diferente basada en un perfil de entorno actual diferente.

¿Cómo puede obtener los perfiles actualmente activos y predeterminados de Spring?

  • @aweigold: obtenga el perfil de entorno activo/predeterminado actual programáticamente en la primavera 3.1. ¿Qué más detalles necesitas?

    – Bobo

    13 de febrero de 2012 a las 21:00

avatar de usuario
aweigold

Puede autoconectar el Environment

@Autowired
Environment env;

Environment ofertas:

  • ¿Cómo puedo conseguir tal cosa en estático métodos en no administrado por resorte clases?

    – Éterus

    1 de febrero de 2019 a las 1:59


  • Intentaría agregar el nombre del perfil como un parámetro de método y pasarlo de la clase que llama.

    – botta

    8 de febrero de 2021 a las 15:15


  • Parece que Spring 5.1 está en desuso acceptsProfiles(String... profiles) y lo reemplazó con acceptsProfiles(Profiles profiles).

    – M. Justin

    28 de febrero a las 19:29

avatar de usuario
Martín Mlima

Ampliando la respuesta simple y agradable de User1648825:

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

Esto puede generar una IllegalArgumentException si no se establecen perfiles (obtengo un valor nulo). Esto puede ser algo bueno si necesita configurarlo; si no, use la sintaxis ‘predeterminada’ para @Value, es decir:

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

… activeProfile ahora contiene ‘Desconocido’ si spring.profiles.active no se pudo resolver

avatar de usuario
Anatomía

Aquí hay un ejemplo más completo.

Entorno de cableado automático

Primero querrá conectar automáticamente el bean de entorno.

@Autowired
private Environment environment;

Comprobar si existen perfiles en perfiles activos

Entonces puedes usar getActiveProfiles() para saber si el perfil existe en la lista de perfiles activos. He aquí un ejemplo que toma el String[] desde getActiveProfiles()obtiene una secuencia de esa matriz, luego usa comparadores para buscar múltiples perfiles (sin distinción entre mayúsculas y minúsculas) que devuelve un valor booleano si existen.

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

También puede lograr una funcionalidad similar usando la anotación @Profile("local") Los perfiles permiten una configuración selectiva basada en un parámetro de entorno o pasado. Aquí hay más información sobre esta técnica: Perfiles de resorte

  • @Profile parece la mejor solución.

    – Pablo Waldo

    11 de diciembre de 2017 a las 14:13

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

Funciona y no necesita implementar EnvironmentAware. Pero no conozco los inconvenientes de este enfoque.

Si no está utilizando el cableado automático, simplemente implemente EnvironmentAware

avatar de usuario
Miguel

Parece que hay cierta demanda para poder acceder a esto de forma estática.

¿Cómo puedo obtener tal cosa en métodos estáticos en clases no administradas por resorte? – Éterus

Es un truco, pero puedes escribir tu propia clase para exponerlo. Debe tener cuidado para asegurarse de que nada llamará SpringContext.getEnvironment() antes de que se hayan creado todos los beans, ya que no hay garantía de cuándo se creará una instancia de este 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;
    }
}

Como ya se mencionó anteriormente. Podrías autoconectar Ambiente:

@Autowired
private Environment environment;

solo usted podría verificar el entorno necesario mucho más fácilmente:

if (environment.acceptsProfiles(Profiles.of("test"))) {
    doStuffForTestEnv();

} else {
    doStuffForOtherProfiles();
}

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad