Necesito codificar diferentes lógicas basadas en diferentes perfiles de entorno actuales. ¿Cómo puede obtener los perfiles activos y predeterminados actuales de Spring?
java
spring
spring-profiles
Bobo
fuente
fuente
Respuestas:
Puedes conectar automáticamente el
Environment
Environment
ofrece:String[] getActiveProfiles()
,String[] getDefaultProfiles()
yboolean acceptsProfiles(String... profiles)
fuente
Ampliando la respuesta simple y agradable de User1648825 (no puedo comentar y mi edición fue rechazada):
Esto puede arrojar una IllegalArgumentException si no se establecen perfiles (obtengo un valor nulo). Esto puede ser algo bueno si necesita que se configure; si no, use la sintaxis 'predeterminada' para @Value, es decir:
... activeProfile ahora contiene 'Desconocido' si spring.profiles.active no se pudo resolver
fuente
Aquí hay un ejemplo más completo.
Entorno de cableado automático
Primero querrá conectar automáticamente el bean de entorno.
Comprobar si existen perfiles en perfiles activos
Luego puede usar
getActiveProfiles()
para averiguar si el perfil existe en la lista de perfiles activos. Aquí hay un ejemplo que toma elString[]
degetActiveProfiles()
, obtiene una secuencia de esa matriz y luego usa los comparadores para verificar si hay varios perfiles (mayúsculas y minúsculas) que devuelve un valor booleano si existen.También puede lograr una funcionalidad similar utilizando la anotación Los
@Profile("local")
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: Spring Profilesfuente
Funciona y no necesita implementar EnvironmentAware. Pero no conozco los inconvenientes de este enfoque.
fuente
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
@Profile
. Las aplicaciones también pueden usar laspring.profiles.include
propiedad y pueden establecer perfiles mediante programación durante la inicialización usandoConfigurableEnvironment
.Environment.getActiveProfiles()
obtendrá la lista completa de perfiles configurados con cualquiera de estos mecanismos.Si no está utilizando el cableado automático, simplemente implemente
EnvironmentAware
fuente
Parece que hay una cierta demanda para poder acceder a esto estáticamente.
Es un truco, pero puedes escribir tu propia clase para exponerlo. Debe tener cuidado para asegurarse de que nada llame
SpringContext.getEnvironment()
antes de que se hayan creado todos los beans, ya que no hay garantía de cuándo se instanciará este componente.fuente