Конфигурация Spring YAML профиля
Я не уверен, хорошо ли я понимаю, как профили Spring работают с файлами yaml и свойствами. Я пытался ошибиться в этих двух типах конфигурации (эти два файла не имеют общей конфигурации), но у меня возникают проблемы при чтении профилей из конфигурации yaml.
Я использую Spring 4.1.1
Вот код Это контекст: конфигурация свойства-заполнителя:
<context:property-placeholder location="classpath:/job-config.properties" order="1"
ignore-unresolvable="true" ignore-resource-not-found="false"/>
<context:property-placeholder properties-ref="yamlProperties" order="2"
ignore-resource-not-found="false" ignore-unresolvable="true"/>
где yamlProperties - следующий компонент
<bean id="yamlProperties"
class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources"
value="file:${catalina.home}/properties/test.yml"/>
</bean>
Вот test.yml
spring:
profiles.default: default
---
spring:
profiles: default
db:
url: jdbc:oracle:thin:@##hostname##:##port##:##SID##
usr: ##USER##
pwd: ##PWD##
---
spring:
profiles: development
db:
url: jdbc:oracle:thin:@##hostname##:##port##:##SID_DEVELOPMENT##
usr: ##USER_DEVELOPMENT##
pwd: ##PWD_DEVELOPMENT##
Моя проблема заключается в том, что когда я пытаюсь настроить (через xml) мои источники данных, сделав это:
<property name="url" value="${db.url}"/>
<property name="username" value="${db.usr}"/>
<property name="password" value="${db.pwd}"/>
Spring всегда использует последнюю конфигурацию в файле YAML, игнорируя профиль. Я попытался передать активный профиль через contextx-параметр в web.xml или напрямую в JVM (я реализовал компонент, реализующий интерфейс EnvironmentAware для получения профилей active / default и его правильного значения), и это кажется хорошим, но при попытке введите значения профиль игнорируется.
Я считаю, что используя контекст свойства-заполнителя (с заказами), я получаю одно свойство-заполнитель, который является экземпляром PropertySourcesPlaceholderConfigurer, то есть с доступом к среде, но я не могу понять, почему профиль игнорируется, и Spring получает последнюю конфигурацию файла yaml.
Я добавляю ссылку на документацию (spring-boot) в разделе 63.6 http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html
заранее спасибо
1 ответ
Не уверен, поможет ли это на данный момент, но вот что я сделал.
Я использовал класс SpringProfileDocumentMatcher [от Дэйва Сайера из весенней загрузки] в качестве базового сопоставителя и реализовал EnvironmentAware для получения профилей активных компонентов и передачи этого компонента в компонент YamlPropertiesFactoryBean. Вот код:
applicationContext.xml
<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources" value="classpath:application.yml" />
<property name="documentMatchers">
<bean class="com.vivastream.quant.spring.SpringProfileDocumentMatcher" />
</property>
SpringProfileDocumentMatcher.java
public class SpringProfileDocumentMatcher implements DocumentMatcher, EnvironmentAware {
private static final String[] DEFAULT_PROFILES = new String[] {
"^\\s*$"
};
private String[] activeProfiles = new String[0];
public SpringProfileDocumentMatcher() {
}
@Override
public void setEnvironment(Environment environment) {
if (environment != null) {
addActiveProfiles(environment.getActiveProfiles());
}
}
public void addActiveProfiles(String... profiles) {
LinkedHashSet<String> set = new LinkedHashSet<String>(Arrays.asList(this.activeProfiles));
Collections.addAll(set, profiles);
this.activeProfiles = set.toArray(new String[set.size()]);
}
@Override
public MatchStatus matches(Properties properties) {
String[] profiles = this.activeProfiles;
if (profiles.length == 0) {
profiles = DEFAULT_PROFILES;
}
return new ArrayDocumentMatcher("spring.profiles", profiles).matches(properties);
}
}