我有多个由Spring配置文件驱动的环境,如application-int.yml
、application-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
。这不是一个很优雅的解决方案,但它很有效。将Environment
bean注入到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");
}
}
}