YAML naar lijst met objecten in Spring Boot

1. Overzicht

In deze korte tutorial gaan we die nader bekijken hoe een YAML-lijst in een Lijst in Spring Boot.

We beginnen met wat achtergrondinformatie over het definiëren van lijsten in YAML. Vervolgens zullen we dieper graven om te zien hoe u YAML-lijsten kunt binden Lijsts van objecten.

2. Korte samenvatting over lijsten in YAML

Kortom, YAML is een door mensen leesbare standaard voor gegevensserialisering die een beknopte en duidelijke manier biedt om configuratiebestanden te schrijven. Het goede aan YAML is het feit dat het meerdere gegevenstypen ondersteunt, zoals Lijsts, Kaarts en scalaire typen.

De elementen in een YAML-lijst worden gedefinieerd met het teken "-" en hebben allemaal hetzelfde inspringingsniveau:

yamlconfig: lijst: - item1 - item2 - item3 - item4

Ter vergelijking: het op eigenschappen gebaseerde equivalent gebruikt indices:

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

Neem voor meer voorbeelden gerust een kijkje in ons artikel over het definiëren van lijsten en kaarten met YAML en eigenschappenbestanden.

In feite is de hiërarchische aard van YAML verbetert de leesbaarheid aanzienlijk in vergelijking met eigenschappenbestanden. Een ander interessant kenmerk van YAML is de mogelijkheid om verschillende eigenschappen voor verschillende veerprofielen te definiëren.

Het is vermeldenswaard dat Spring Boot out-of-box ondersteuning biedt voor YAML-configuratie. Door het ontwerp laadt Spring Boot configuratie-eigenschappen van application.yml bij het opstarten zonder extra werk.

3. Een YAML-lijst aan een Simple binden Lijst van objecten

Spring Boot biedt de @ConfigurationProperties annotatie bij vereenvoudig de logica van het toewijzen van externe configuratiegegevens aan een objectmodel.

In dit gedeelte gebruiken we @ConfigurationProperties om een ​​YAML-lijst te binden aan een Lijst.

We beginnen met het definiëren van een eenvoudige lijst in application.yml:

toepassing: profielen: - dev - test - prod - 1 - 2

Vervolgens maken we een simple ApplicationProps POJO om de logica vast te houden van het binden van onze YAML-lijst aan een Lijst vanvoorwerpen:

@Component @ConfigurationProperties (prefix = "application") openbare klasse ApplicationProps {privélijstprofielen; // getter en setter}

De ApplicationProps klasse moet worden versierd met @ConfigurationProperties om de intentie uit te drukken om alle YAML-eigenschappen met het opgegeven voorvoegsel toe te wijzen aan een object van ApplicationProps.

Om het profielen lijst hoeven we alleen maar een veld van het type te definiëren Lijst en de @ConfigurationProperties annotatie zorgt voor de rest.

Merk op dat we het ApplicationProps klasse als een normale Spring bean gebruiken @Component. Als gevolg hiervan kunnen we het op dezelfde manier in andere klassen injecteren als elke andere Spring bean.

Ten slotte injecteren we de ApplicationProps bean in een testklasse en controleer of onze profielen YAML-lijst is correct geïnjecteerd als een Lijst:

@ExtendWith (SpringExtension.class) @ContextConfiguration (initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties (waarde = ApplicationProps.class) klasse YamlSimpleListUnitTest {@Autowired private ApplicationProps applicationProps; @Test openbare leegte 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. YAML-lijsten aan complexe lijsten binden

Laten we nu dieper duiken en zien hoe geneste YAML-lijsten kunnen worden geïnjecteerd in complexe gestructureerde Lijsts.

Laten we eerst enkele geneste lijsten toevoegen aan application.yml:

applicatie: // ... rekwisieten: - naam: YamlList url: //yamllist.dev beschrijving: Mapping lijst in Yaml naar lijst met objecten in Spring Boot - ip: 10.10.10.10 poort: 8091 - e-mail: [email protected] contact : //yamllist.dev/contact gebruikers: - gebruikersnaam: admin wachtwoord: [email protected] @ rollen: - LEZEN - SCHRIJVEN - BEKIJKEN - VERWIJDEREN - gebruikersnaam: gast wachtwoord: [email beschermd] rollen: - BEKIJK

In dit voorbeeld gaan we de rekwisieten eigendom aan een Lijst. Evenzo zullen we in kaart brengen gebruikers in een Lijst van Gebruiker voorwerpen.

Omdat elk element van de rekwisieten invoer bevat verschillende sleutels, dan kunnen we het injecteren als een Lijst van Kaarts. Lees zeker ons artikel over het injecteren van een kaart vanuit een YAML-bestand in Spring Boot.

Echter, in het geval van gebruikers, alle items hebben dezelfde sleutels, dus om het in kaart brengen te vereenvoudigen, moeten we mogelijk een dedicated Gebruiker class om de sleutels in te kapselen als velden:

openbare klasse ApplicationProps {// ... privélijst rekwisieten; privélijst gebruikers; // getters en setters openbare statische klasse User {private String gebruikersnaam; privé String-wachtwoord; privélijstrollen; // getters en setters}}

Nu verifiëren we dat onze geneste YAML-lijsten correct zijn toegewezen:

@ExtendWith (SpringExtension.class) @ContextConfiguration (initializers = ConfigFileApplicationContextInitializer.class) @EnableConfigurationProperties (waarde = ApplicationProps.class) klasse YamlComplexListsUnitTest {@Autowired private ApplicationProps applicationProps; @Test openbare leegte whenYamlNestedLists_thenLoadComplexLists () {assertThat (applicationProps.getUsers (). Get (0) .getPassword ()). IsEqualTo ("[email protected] @"); assertThat (applicationProps.getProps (). get (0) .get ("naam")). isEqualTo ("YamlList"); assertThat (applicationProps.getProps (). get (1) .get ("poort"). getClass ()). isEqualTo (Integer.class); }}

5. Conclusie

In deze zelfstudie hebben we geleerd hoe we YAML-lijsten in Java kunnen toewijzen Lijsts. We hebben ook gecontroleerd hoe complexe lijsten aan aangepaste POJO's kunnen worden gekoppeld.

Zoals altijd is de volledige broncode voor dit artikel beschikbaar op GitHub.