@PropertySource mit YAML-Dateien im Spring Boot

1. Übersicht

In diesem kurzen Tutorial zeigen wir Ihnen, wie Sie eine YAML-Eigenschaftendatei mithilfe der Annotation @PropertySource in Spring Boot lesen .

2. @ PropertySource- und YAML- Format

Spring Boot bietet hervorragende Unterstützung für die externe Konfiguration. Es ist auch möglich, verschiedene Eigenschaften und Formate zu verwenden, um die Eigenschaften in der Spring Boot-Anwendung sofort zu lesen.

Jedoch standardmäßig @PropertySource nicht YAML - Dateien laden . Diese Tatsache wird in der offiziellen Dokumentation ausdrücklich erwähnt.

Also, wenn wir das nutzen wollen @PropertySource Annotation in unserer Anwendung, müssen wir mit den Standard - Stick Eigenschaften Dateien. Oder wir können das fehlende Puzzleteil selbst implementieren!

3. Benutzerdefinierte PropertySourceFactory

Ab Spring 4.3 wird @PropertySource mit dem Factory- Attribut geliefert . Wir können es verwenden, um unsere benutzerdefinierte Implementierung der PropertySourceFactory bereitzustellen , die die Verarbeitung der YAML-Datei übernimmt .

Das ist einfacher als es klingt! Mal sehen, wie das geht:

public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource createPropertySource(String name, EncodedResource encodedResource) throws IOException { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(encodedResource.getResource()); Properties properties = factory.getObject(); return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties); } }

Wie wir sehen können, reicht es aus, eine einzelne createPropertySource- Methode zu implementieren .

In unserer benutzerdefinierten Implementierung haben wir zuerst die YamlPropertiesFactoryBean verwendet , um die Ressourcen im YAML-Format in das Objekt java.util.Properties zu konvertieren .

Dann haben wir einfach eine neue Instanz der PropertiesPropertySource zurückgegeben , einem Wrapper, mit dem Spring die analysierten Eigenschaften lesen kann.

4. @PropertySource und YAML in Aktion

Lassen Sie uns nun alle Teile zusammenfügen und sehen, wie man sie in der Praxis einsetzt.

Zuerst erstellen wir eine einfache YAML-Datei - foo.yml :

yaml: name: foo aliases: - abc - xyz

Als Nächstes erstellen wir eine Eigenschaftenklasse mit @ConfigurationProperties und verwenden unsere benutzerdefinierte YamlPropertySourceFactory:

@Configuration @ConfigurationProperties(prefix = "yaml") @PropertySource(value = "classpath:foo.yml", factory = YamlPropertySourceFactory.class) public class YamlFooProperties { private String name; private List aliases; // standard getter and setters }

Lassen Sie uns abschließend überprüfen, ob die Eigenschaften ordnungsgemäß injiziert wurden :

@RunWith(SpringRunner.class) @SpringBootTest public class YamlFooPropertiesIntegrationTest { @Autowired private YamlFooProperties yamlFooProperties; @Test public void whenFactoryProvidedThenYamlPropertiesInjected() { assertThat(yamlFooProperties.getName()).isEqualTo("foo"); assertThat(yamlFooProperties.getAliases()).containsExactly("abc", "xyz"); } }

5. Schlussfolgerung

Zusammenfassend haben wir in diesem kurzen Tutorial zunächst gezeigt, wie einfach es ist, eine benutzerdefinierte PropertySourceFactory zu erstellen . Anschließend haben wir vorgestellt, wie diese benutzerdefinierte Implementierung mithilfe ihres Factory- Attributs an @PropertySource übergeben wird.

Folglich konnten wir die YAML-Eigenschaftendatei erfolgreich in unsere Spring Boot-Anwendung laden .

Wie üblich sind alle Codebeispiele auf GitHub verfügbar.