3

我不確定我是否很好理解Spring配置文件如何與yaml和屬性文件配合使用。 我試圖misc這兩種類型的配置(這兩個文件不共享任何配置),但我從yaml配置閱讀配置文件時遇到問題。Spring 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文件中的最後一個配置忽略配置文件。我試圖通過web.xml中的contex參數傳遞活動配置文件或直接傳遞給JVM(我實現了一個實現了EnvironmentAware接口的bean來獲取活動/默認配置文件,並且它是相互對應的),它似乎都很好,但是在嘗試注入值將忽略該配置文件。我相信使用屬性佔位符上下文(與訂單)我得到一個屬性佔位符是PropertySourcesPlaceholderConfigurer的一個實例,因此有權訪問環境,但我不明白爲什麼該配置文件被忽略,並且彈簧獲取最後一個yaml文件配置。

我提前

+0

我通過實現我自己的PropertiesFactory解決。我從Spring引導核心(不是來自Spring核心)和SpringProfileDocumentMatcher導入YamlProcessor。我的類還實現了EnvironmentAware.I更改了createProperties()方法以讀取活動配置文件並設置正確的DocumentMatcher。 – Raffaele

+0

這裏是代碼 String [] activeProfiles = env.getActiveProfiles(); if(activeProfiles.length == 0){ this。setMatchDefault(真); this.setDocumentMatchers(new SpringProfileDocumentMatcher()); } else { this.setMatchDefault(false); SpringProfileDocumentMatcher matcher = new SpringProfileDocumentMatcher(); for(String profile:activeProfiles){ matcher.addActiveProfiles(profile); } this.setDocumentMatchers(matcher); } – Raffaele

+0

我遇到過類似的問題。以下是我如何解決它:https://stackoverflow.com/questions/47717871/spring-boot-profiles-ignored-in-propertysourcesplaceholderconfigurer-loaded-fil – James

回答

4

不知道這是否有助於在這一點上,但這裏是我做了一個引用添加到文件(春季啓動),在部分63.6 http://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html

感謝。

我使用SpringProfileDocumentMatcher類[由Dave Syer從spring引導]作爲我的基本匹配器,並實現了EnvironmentAware以獲取活動配置文件並將此Bean傳遞給YamlPropertiesFactoryBean bean。 下面是代碼:

的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); 
} 

}

+0

謝謝古斯塔沃,基本上我採用了類似的解決方案。再次感謝 – Raffaele

+0

嘿它工作,你減輕了我的壓力..謝謝.. – Kaliappan

+0

我嘗試這種方法,它適用於我 –