YAML zur Liste der Objekte im Spring Boot

1. Übersicht

In diesem kurzen Tutorial werden wir uns genauer ansehen, wie eine YAML-Liste in Spring Boot einer Liste zugeordnet wird .

Wir beginnen zunächst mit Hintergrundinformationen zum Definieren von Listen in YAML. Dann werden wir tiefer gehen, um zu sehen, wie YAML-Listen an Listen von Objekten gebunden werden.

2. Kurzer Überblick über Listen in YAML

Kurz gesagt, YAML ist ein lesbarer Serialisierungsstandard für Daten, der eine präzise und übersichtliche Möglichkeit zum Schreiben von Konfigurationsdateien bietet. Das Gute an YAML ist die Tatsache, dass es mehrere Datentypen wie Listen , Karten und Skalartypen unterstützt .

Die Elemente in einer YAML-Liste werden mit dem Zeichen "-" definiert und haben alle dieselbe Einrückungsstufe:

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

Zum Vergleich verwendet das eigenschaftsbasierte Äquivalent Indizes:

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

Weitere Beispiele finden Sie in unserem Artikel zum Definieren von Listen und Karten mithilfe von YAML- und Eigenschaftendateien.

Tatsächlich verbessert die hierarchische Natur von YAML die Lesbarkeit im Vergleich zu Eigenschaftendateien erheblich . Ein weiteres interessantes Merkmal von YAML ist die Möglichkeit, unterschiedliche Eigenschaften für unterschiedliche Federprofile zu definieren.

Erwähnenswert ist, dass Spring Boot die YAML-Konfiguration sofort unterstützt. Spring Boot lädt standardmäßig Konfigurationseigenschaften aus application.yml beim Start ohne zusätzliche Arbeit.

3. Binden einer YAML-Liste an eine einfache Liste von Objekten

Spring Boot bietet die Annotation @ConfigurationProperties , um die Logik der Zuordnung externer Konfigurationsdaten zu einem Objektmodell zu vereinfachen .

In diesem Abschnitt verwenden wir @ConfigurationProperties , um eine YAML-Liste in eine Liste zu binden .

Wir beginnen mit der Definition einer einfachen Liste in application.yml :

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

Anschließend erstellen wir ein einfaches ApplicationProps- POJO, das die Logik zum Binden unserer YAML-Liste an eine Liste von enthältObjekte:

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

Die ApplicationProps- Klasse muss mit @ConfigurationProperties dekoriert werden , um die Absicht auszudrücken, alle YAML-Eigenschaften mit dem angegebenen Präfix einem Objekt von ApplicationProps zuzuordnen .

Um die Profilliste zu binden , müssen wir nur ein Feld vom Typ Liste definieren, und die Annotation @ConfigurationProperties kümmert sich um den Rest.

Beachten Sie, dass wir die ApplicationProps- Klasse mit @Component als normale Spring Bean registrieren . Infolgedessen können wir es auf dieselbe Weise wie jede andere Spring Bean in andere Klassen injizieren.

Schließlich fügen wir die ApplicationProps- Bean in eine Testklasse ein und überprüfen, ob unsere Profil- YAML-Liste korrekt als Liste eingefügt wurde :

@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. Binden von YAML-Listen an komplexe Listen

Lassen Sie uns nun tiefer eintauchen und sehen, wie verschachtelte YAML-Listen in komplex strukturierte Listen eingefügt werden .

Fügen wir zunächst einige verschachtelte Listen zu application.yml hinzu :

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

In diesem Beispiel binden wir die Eigenschaft " Requisiten" an eine Liste . In ähnlicher Weise ordnen wir Benutzer einer Liste von Benutzerobjekten zu .

Da jedes Element des Requisiteneintrags unterschiedliche Schlüssel enthält, können wir es als Liste der Karten einfügen . Lesen Sie unbedingt unseren Artikel zum Einfügen einer Karte aus einer YAML-Datei in Spring Boot .

Jedoch , im Fall von Benutzern , werden alle Elemente die gleichen Schlüssel teilen, so seine Zuordnung zu vereinfachen, müssen wir eine eigene erstellen Benutzerklasse kapseln die Schlüssel als Felder:

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

Jetzt überprüfen wir, ob unsere verschachtelten YAML-Listen ordnungsgemäß zugeordnet sind:

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

In diesem Tutorial haben wir gelernt , wie YAML Listen in Java zur Karte Liste s. Wir haben auch überprüft, wie komplexe Listen an benutzerdefinierte POJOs gebunden werden.

Wie immer ist der vollständige Quellcode für diesen Artikel auf GitHub verfügbar.