@PropertySource avec des fichiers YAML dans Spring Boot

1. Vue d'ensemble

Dans ce tutoriel rapide, nous montrerons comment lire un fichier de propriétés YAML à l'aide de l' annotation @PropertySource dans Spring Boot.

2. @PropertySource et format YAML

Spring Boot offre un excellent support pour la configuration externalisée. En outre, il est possible d'utiliser différentes méthodes et formats pour lire les propriétés dans l'application Spring Boot prête à l'emploi.

Cependant, par défaut, @PropertySource ne charge pas les fichiers YAML . Ce fait est explicitement mentionné dans la documentation officielle.

Donc, si nous voulons utiliser l' annotation @PropertySource dans notre application, nous devons nous en tenir aux fichiers de propriétés standard . Ou nous pouvons implémenter nous-mêmes la pièce manquante du puzzle!

3. PropertySourceFactory personnalisé

Depuis le printemps 4.3, @PropertySource est fourni avec l' attribut factory . Nous pouvons l'utiliser pour fournir notre implémentation personnalisée de PropertySourceFactory , qui gérera le traitement du fichier YAML .

C'est plus facile qu'il n'y paraît! Voyons comment procéder:

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

Comme nous pouvons le voir, il suffit d'implémenter une seule méthode createPropertySource .

Dans notre implémentation personnalisée, nous avons d'abord utilisé le YamlPropertiesFactoryBean pour convertir les ressources au format YAML en objet java.util.Properties .

Ensuite, nous avons simplement renvoyé une nouvelle instance de PropertiesPropertySource , qui est un wrapper qui permet à Spring de lire les propriétés analysées.

4. @PropertySource et YAML en action

Assemblons maintenant toutes les pièces et voyons comment les utiliser dans la pratique.

Commençons par créer un simple fichier YAML - foo.yml :

yaml: name: foo aliases: - abc - xyz

Ensuite, créons une classe de propriétés avec @ConfigurationProperties et utilisons notre YamlPropertySourceFactory personnalisé :

@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 }

Et enfin, vérifions que les propriétés sont correctement injectées :

@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. Conclusion

Pour résumer, dans ce tutoriel rapide, nous avons d'abord montré à quel point il est facile de créer une PropertySourceFactory personnalisée . Après cela, nous avons présenté comment transmettre cette implémentation personnalisée à @PropertySource à l' aide de son attribut factory .

Par conséquent, nous avons réussi à charger le fichier de propriétés YAML dans notre application Spring Boot .

Comme d'habitude, tous les exemples de code sont disponibles à l'adresse over sur GitHub.