YAML à la liste des objets dans Spring Boot

1. Vue d'ensemble

Dans ce court didacticiel, nous allons examiner de plus près comment mapper une liste YAML dans une liste dans Spring Boot .

Nous commencerons par quelques informations sur la manière de définir des listes en YAML. Ensuite, nous allons creuser plus profond pour voir comment lier les listes YAML à la liste d ' objets.

2. Récapitulatif rapide des listes dans YAML

En bref, YAML est une norme de sérialisation de données lisible par l'homme qui fournit un moyen concis et clair d'écrire des fichiers de configuration. La bonne chose à propos de YAML est le fait qu'il prend en charge plusieurs types de données tels que les listes , les mappes et les types scalaires .

Les éléments d'une liste YAML sont définis à l'aide du caractère «-» et partagent tous le même niveau d'indentation:

yamlconfig: list: - item1 - item2 - item3 - item4

À titre de comparaison, l'équivalent basé sur les propriétés utilise des indices:

yamlconfig.list[0]=item1 yamlconfig.list[1]=item2 yamlconfig.list[2]=item3 yamlconfig.list[3]=item4

Pour plus d'exemples, n'hésitez pas à consulter notre article sur la façon de définir des listes et des cartes à l'aide de YAML et de fichiers de propriétés.

En fait, la nature hiérarchique de YAML améliore considérablement la lisibilité par rapport aux fichiers de propriétés . Une autre caractéristique intéressante de YAML est la possibilité de définir différentes propriétés pour différents profils Spring.

Il convient de mentionner que Spring Boot fournit un support prêt à l'emploi pour la configuration YAML. De par sa conception, Spring Boot charge les propriétés de configuration depuis application.yml au démarrage sans aucun travail supplémentaire.

3. Lier une liste YAML à une simple liste d'objets

Spring Boot fournit l' annotation @ConfigurationProperties pour simplifier la logique de mappage des données de configuration externes dans un modèle objet .

Dans cette section, nous utiliserons @ConfigurationProperties pour lier une liste YAML à une liste .

Nous commençons par définir une liste simple dans application.yml :

application: profiles: - dev - test - prod - 1 - 2

Ensuite, nous allons créer un simple POJO ApplicationProps pour contenir la logique de liaison de notre liste YAML à une liste deobjets:

@Component @ConfigurationProperties(prefix = "application") public class ApplicationProps { private List profiles; // getter and setter }

La classe ApplicationProps doit être décorée avec @ConfigurationProperties pour exprimer l'intention de mapper toutes les propriétés YAML avec le préfixe spécifié à un objet d' ApplicationProps .

Pour lier la liste des profils, il suffit de définir un champ de type List et l' annotation @ConfigurationProperties s'occupera du reste.

Notez que nous enregistrons la classe ApplicationProps en tant que Spring bean normal en utilisant @Component . En conséquence, nous pouvons l'injecter dans d'autres classes de la même manière que n'importe quel autre bean Spring.

Enfin, nous injectons le bean ApplicationProps dans une classe de test et vérifions si notre liste YAML de profils est correctement injectée en tant que List :

@ExtendWith(SpringExtension.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties(value = ApplicationProps.class) class YamlSimpleListUnitTest { @Autowired private ApplicationProps applicationProps; @Test public void whenYamlList_thenLoadSimpleList() { assertThat(applicationProps.getProfiles().get(0)).isEqualTo("dev"); assertThat(applicationProps.getProfiles().get(4).getClass()).isEqualTo(Integer.class); assertThat(applicationProps.getProfiles().size()).isEqualTo(5); } }

4. Lier les listes YAML aux listes complexes

Maintenant, nous allons plonger plus profondément et de voir comment injecter des listes imbriquées dans YAML complexe structuré Liste s .

Tout d'abord, ajoutons quelques listes imbriquées à application.yml :

application: // ... props: - name: YamlList url: //yamllist.dev description: Mapping list in Yaml to list of objects in Spring Boot - ip: 10.10.10.10 port: 8091 - email: [email protected] contact: //yamllist.dev/contact users: - username: admin password: [email protected]@ roles: - READ - WRITE - VIEW - DELETE - username: guest password: [email protected] roles: - VIEW

Dans cet exemple, nous allons lier la propriété props à un List . De même, nous mapperons les utilisateurs dans une liste d' objets utilisateur .

Étant donné que chaque élément de l' accessoires entrée contient des clés différentes, nous pouvons injecter comme liste de carte s . N'oubliez pas de consulter notre article sur la façon d'injecter une carte à partir d'un fichier YAML dans Spring Boot .

Cependant , dans le cas des utilisateurs , tous les éléments partagent les mêmes clés, donc pour simplifier son mappage, nous pouvons avoir besoin de créer une classe User dédiée pour encapsuler les clés sous forme de champs:

public class ApplicationProps { // ... private List props; private List users; // getters and setters public static class User { private String username; private String password; private List roles; // getters and setters } }

Nous vérifions maintenant que nos listes YAML imbriquées sont correctement mappées:

@ExtendWith(SpringExtension.class) @ContextConfiguration(initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties(value = ApplicationProps.class) class YamlComplexListsUnitTest { @Autowired private ApplicationProps applicationProps; @Test public void whenYamlNestedLists_thenLoadComplexLists() { assertThat(applicationProps.getUsers().get(0).getPassword()).isEqualTo("[email protected]@"); assertThat(applicationProps.getProps().get(0).get("name")).isEqualTo("YamlList"); assertThat(applicationProps.getProps().get(1).get("port").getClass()).isEqualTo(Integer.class); } }

5. Conclusion

Dans ce tutoriel, nous avons appris à la carte des listes YAML en Java Liste de. Nous avons également vérifié comment lier des listes complexes à des POJO personnalisés.

Comme toujours, le code source complet de cet article est disponible à l'adresse over sur GitHub.