0

Ich habe eine Bibliothek, die ein Spring Boot-Projekt ist. Die Bibliothek verfügt über eine library.yml-Datei, die Entwickler und prod Requisiten für seine Konfiguration enthält:Spring Boot: Profile ignoriert in PropertySourcesPlaceholderConfigurer geladene Datei

library.yml

--- 
spring: 
    profiles: 
     active: dev 
--- 
spring: 
    profiles: dev 
env: dev 
--- 
spring: 
    profiles: prod 
env: prod 

Eine weitere Anwendung dieser Bibliothek verwendet und lädt die Requisiten:

@Bean 
public static PropertySourcesPlaceholderConfigurer dataProperties() { 
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); 
    yaml.setResources(new ClassPathResource("library.yml")); 
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject()); 
    return propertySourcesPlaceholderConfigurer; 
} 

Und seine application.yml sagt, Dev-Stützen zu verwenden:

--- 
spring: 
    profiles: 
     active: dev 

Aber wenn ich den Wert von env überprüfe, bekomme ich "prod". Warum?

Wie kann ich Spring Boot mitteilen, die aktiven Profilrequisiten (z. B. dev) in library.yml zu verwenden?

Hinweis: Ich bevorzuge .yml statt .properties-Dateien.

+0

haben Sie versucht, --spring.profiles.active = dev als Befehlszeilenargument zu übergeben? –

+0

Nein. Aber ich habe überprüft, dass das aktive Profil dev ist. Ich habe eine Lösung, die ich posten werde. – James

Antwort

0

Standardmäßig weiß die PropertySourcesPlaceholderConfigurer nichts über profilspezifische Requisiten. Wenn Sie eine Stütze mehrfach in einer Datei wie env definiert haben, wird der Wert gebunden, der dem letzten Vorkommen dieser Stütze zugeordnet ist (in diesem Fall prod).

Um die Requisiten für ein bestimmtes Profil zu binden, legen Sie einen Profildokument-Matcher fest. Der Profildokument-Matcher muss das aktive Profil kennen, das aus der Umgebung bezogen werden kann. Hier ist der Code:

@Bean 
public static PropertySourcesPlaceholderConfigurer dataProperties(Environment environment) { 
    PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer(); 
    YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean(); 
    SpringProfileDocumentMatcher matcher = new SpringProfileDocumentMatcher(); 
    matcher.addActiveProfiles(environment.getActiveProfiles()); 
    yaml.setDocumentMatchers(matcher); 
    yaml.setResources(new ClassPathResource("library.yml")); 
    propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject()); 
    return propertySourcesPlaceholderConfigurer; 
} 
Verwandte Themen