Spring通过配置文件的组合选择属性源



我有多个由Spring配置文件驱动的环境,如application-int.ymlapplication-dev.yml等,内容相似:

  • application-int.yml
    ws:
    endpoint: http://my-soap-int-endpoint.com/
    mock: http://my-soap-int-mock-endpoint.com/
    
  • application-dev.yml
    ws:
    endpoint: http://my-soap-dev-endpoint.com/
    mock: http://my-soap-dev-mock-endpoint.com/
    

我的目标是在环境名称是否包括mock配置文件的基础上使用以下属性:

dev配置文件的application-dev.yml中的
  • ws.endpoint
  • int配置文件的application-int.yml中的ws.endpoint
  • dev mock配置文件的application-dev.yml中的ws.mock
  • int mock配置文件的application-int.yml中的ws.mock

我需要将该值解析为单个变量url:

@Configuration
public class SoapConfiguration {
@Value("???")                  // based on 2 properties
private String wsUrl;
}

我希望避免基于@Profile的抽象配置类的复杂层次结构。此外,我需要将两个变量(mock和非mock(保存在一个公共属性文件中。

有没有一种既可读又可维护的好方法?

您可以在构造函数中设置wsUrl。这不是一个很优雅的解决方案,但它很有效。将Environmentbean注入到SoapConfiguration中,并检查mock配置文件是否处于活动状态
代码示例:

@Configuration
public class SoapConfiguration {
private final String wsUrl;
public SoapConfiguration(Environment environment) {
if (Arrays.asList(environment.getActiveProfiles()).contains("mock")) {
this.wsUrl = environment.getProperty("ws.mock");
} else {
this.wsUrl = environment.getProperty("ws.endpoint");
}
}
}

最新更新