Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set active profile programmatically for any environment?

I want to set active profile host dependent for any envrionment and cannot find an environment independent hook.

Following factory will set the active profile before application context will build.

/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializer

MyApplicationContextInitializer.java

public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {
    @Override
    public void initialize(ConfigurableApplicationContext ca) {
        ConfigurableEnvironment environment = ca.getEnvironment();
        environment.addActiveProfile("myHost");
    }
}

If this example is executed in a mock environment by JUnit ...

*Test.java

...
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
...

... following will be logged.

...
... RestControllerTests   : The following profiles are active: myHost
...

but profile myHost is not active and default profile will be used in context of JUnit!

A test as Java Application and JUnit with VM arguments works ...

-Dspring.profiles.active=myHost

I use a war packaged spring-boot-starter-web app and programmatically profile shall be set and used in any environment

  • Java Application
  • JUnit
  • Servlet Container

How do I set the profile programmatically for any environmnet?

I do not want to use VM arguments or environemt variables because the profile shall be set by the current host name.

like image 897
mg. Avatar asked Mar 07 '17 10:03

mg.


People also ask

How do you define beans for a specific profile?

Bean definition profiles are a mechanism by which application context is configured differently for different environments. You group bean definitions under named profiles in XML or using annotation and activate one or more profiles in each environment.

What is Spring_profiles_active?

SPRING_PROFILES_ACTIVE is the environment variable to override/pick Spring profile.


2 Answers

I had the same issue and I finally solved it implementing the ActiveProfilesResolver interface.

In your case you could do something like this:

public class MyActivateProfilesResolver implements ActiveProfilesResolver {

    @Override
    public String[] resolve(Class<?> testClass) {
         // some code to find out your active profiles
         return new String[] {"myHost"};
    }
}

And then you need to link your test with your resolver like this:

@ActiveProfiles(resolver = MyActivateProfilesResolver.class)
like image 23
Abel ANEIROS Avatar answered Sep 28 '22 09:09

Abel ANEIROS


Simplest answer after a lot of googling :)

@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);
  }
}
like image 122
varun myadam Avatar answered Sep 28 '22 08:09

varun myadam