1

환경에 종속적 인 활성 프로파일 호스트를 설정하고 환경에 독립적 인 후크를 찾을 수 없습니다.활성 환경을 프로그래밍 방식으로 설정하는 방법은 무엇입니까?

다음 공장에서는 응용 프로그램 컨텍스트를 만들기 전에 활성 프로파일을 설정합니다.

/META-INF/spring.factories

org.springframework.context.ApplicationContextInitializer=MyApplicationContextInitializer 

MyApplicationContextInitializer.java 예는 JUnit을 모의하여 환경에서 실행되는 경우

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

...

* Test.java

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

... 다음이 기록됩니다.

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

하지만 여기서 myHost 프로필 이 활성화되지 및 기본 프로파일의 JUnit의 맥락에서 사용됩니다!

VM 인수와 자바 응용 프로그램과의 JUnit과 같은 테스트가 작동 ... 나는 전쟁 패키지 스프링 부팅 스타터 웹 응용 프로그램을 사용하여 프로그램의 프로필을 설정하고 모든 환경에서 사용되어야한다

-Dspring.profiles.active=myHost 

  • 자바 응용 프로그램
  • JUnit을
  • 서블릿 컨테이너

모든 환경에 대해 프로그래밍 방식으로을 어떻게 설정합니까?

프로필은 현재 호스트 이름으로 설정되므로 VM 인수 또는 환경 변수를 사용하고 싶지 않습니다.

답변

0

신청서를 main 방법으로 시작하기 전에 SpringApplication.setAdditionalProfiles(…​)을 사용해 볼 수 있습니다.

활성 프로필을 선택하기 위해 호스트/일부 변수 등을 확인하는 사용자 지정 쿼리를 사용할 수 있습니다.

문서는 참조 : boot-features-programmatically-setting-profiles

편집 :

당신은 당신의 목표를 달성하기 위해 ConfigurableEnvironment를 사용하려고 할 수 있습니다.

다음과 같이 BeanFactoryPostProcessor 구현하는 클래스 만들기 :

public class ConfigurableEnvironmentProcessor implements BeanFactoryPostProcessor { 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     ConfigurableEnvironment env = beanFactory.getBean(ConfigurableEnvironment.class); 
     // add custom code to get properties based on custom code 
    } 

} 

이 그런 다음 포스트 프로세서의 빈을 등록 :

@Bean 
public static BeanFactoryPostProcessor configurableEnvironmentProcessor() { 
    return new ConfigurableEnvironmentProcessor(); 
} 

그것은 중요한 것은 방법은 static되기 위해서는 때문에 봄 부팅 초기화 이러한 메소드는 구성 클래스가 완전히 초기화되기 전에 몇 번이고 클래스를 완전히 초기화하지 않고도 static으로 설정할 수 있습니다.

+0

이 솔루션은 자바 애플리케이션 만 아니라 실행 작동 왜냐하면'main' 메쏘드는 서블릿 컨테이너 나 JUnit-Tests에서 사용되지 않기 때문입니다. –

+0

@mg. 당신을 도울 다른 옵션으로 편집. – Tom

+0

'postProcessBeanFactory'는 활성 프로파일이 이미 설정된 후에 호출됩니다. 프로파일에 대한 로그를 얻습니다. 기본 프로파일로 돌아가는 활성 프로파일 세트가 없습니다. 디폴트 및 로그는 @'... oswcsGenericWebApplicationContext : 새로 고침 org.s[email protected]2df6226d : 시작 날짜 [..] .]; 'postProcessBeanFactory'에서 내 중단 점에 대한 컨텍스트 계층의 루트. –

0

나는 동일한 문제가있어서 마침내 ActiveProfilesResolver 인터페이스를 구현하여 해결했습니다.

public class MyActivateProfilesResolver implements ActiveProfilesResolver { 

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

을 그리고 당신은이처럼 해결하여 테스트를 연결해야합니다 : 귀하의 경우

당신이 뭔가를 할 수

@ActiveProfiles(resolver = MyActivateProfilesResolver.class) 
관련 문제