Quiero establecer un host de perfil activo dependiente para cualquier entorno y no puedo encontrar un gancho independiente del entorno.
La siguiente fábrica establecerá el perfil activo antes de que se construya el contexto de la aplicación.
/META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializerMiAplicaciónContextInitializer.java
public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { @Override public void initialize(ConfigurableApplicationContext ca) { ConfigurableEnvironment environment = ca.getEnvironment(); environment.addActiveProfile("myHost"); } }Si JUnit ejecuta este ejemplo en un entorno simulado...
*Prueba.java
... @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc ...... siguiente será registrado.
... ... RestControllerTests : The following profiles are active: myHost ...¡pero el perfil myHost no está activo y el perfil predeterminado se usará en el contexto de JUnit!
Una prueba como Java Application y JUnit con argumentos VM funciona ...
-Dspring.profiles.active=myHostUtilizo una aplicación spring-boot-starter-web empaquetada en guerra y el perfil programático se configurará y usará en cualquier entorno
¿Cómo configuro el perfil mediante programación para cualquier entorno?
No quiero usar argumentos de VM o variables de entorno porque el nombre de host actual establecerá el perfil.
La respuesta más simple después de mucho googlear :)
@SpringBootApplication public class ExampleMain2 { public static void main(String[] args) { ConfigurableEnvironment environment = new StandardEnvironment(); environment.setActiveProfiles("dev"); SpringApplication sa = new SpringApplication(ExampleMain2.class); sa.setEnvironment(environment); sa.setAdditionalProfiles("remote","live"); sa.run(args); } }Tuve el mismo problema y finalmente lo resolví implementando la interfaz ActiveProfilesResolver.
En tu caso podrías hacer algo como esto:
public class MyActivateProfilesResolver implements ActiveProfilesResolver { @Override public String[] resolve(Class<?> testClass) { // some code to find out your active profiles return new String[] {"myHost"}; } }Y luego necesita vincular su prueba con su resolución de esta manera:
@ActiveProfiles(resolver = MyActivateProfilesResolver.class)No creo que exista tal cosa como configurar el perfil activo de forma dinámica (mediante programación) en tiempo de ejecución una vez que la aplicación se está ejecutando, cualquier modificación del perfil no tendrá ningún efecto en los beans cargados y los archivos de propiedades.
Sin embargo, antes de ejecutar la aplicación, puede configurar los perfiles disponibles de la aplicación. por ejemplo:
@SpringBootApplication public class DemoApplicationWithSysProperty { public static void main(String[] args) { System.setProperty(AbstractEnvironment.ACTIVE_PROFILES_PROPERTY_NAME, PROFILE_NAME); SpringApplication.run(DemoApplicationWithSysProperty.class, args); } }