Конфигурация 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);
}

}

Другие вопросы по тегам