1

我想設置任何環境依賴的活動配置文件主機,並且找不到獨立於環境的鉤子。如何以編程方式爲任何環境設置活動配置文件?

下面的工廠將在應用程序上下文構建之前設置活動配置文件。

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

如果這個例子是由JUnit的一個模擬環境中執行...

* Test.java

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

...以下內容將被記錄。

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

但輪廓MYHOST沒有被激活默認的配置文件將在JUnit中的上下文中使用!

測試爲Java應用程序和JUnit與VM參數工作...

-Dspring.profiles.active=myHost 

我用戰爭打包彈簧引導起動器的Web應用程序和編程的個人資料將被設置在任何環境中使用

  • Java應用程序
  • 的JUnit
  • Servlet容器

如何爲任何環境以編程方式設置配置文件

我不想使用VM參數或environemt變量,因爲配置文件應由當前主機名設置。

回答

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:

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

是很重要的方法是static因爲春天開機初始化這些方法在配置類完全初始化之前進行了一些時間,並且通過設置它可以在沒有完全初始化類的情況下完成。

+0

該解決方案適用於運行作爲唯一的Java應用程序因爲'main'方法不會在servlet容器或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) 
相關問題