YAML all'elenco di oggetti in Spring Boot

1. Panoramica

In questo breve tutorial, daremo uno sguardo più da vicino a come mappare un elenco YAML in un elenco in Spring Boot .

Inizieremo prima con alcune informazioni su come definire gli elenchi in YAML. Quindi, scaveremo più a fondo per vedere come associare elenchi YAML a List s di oggetti.

2. Riepilogo rapido degli elenchi in YAML

In breve, YAML è uno standard di serializzazione dei dati leggibile dall'uomo che fornisce un modo conciso e chiaro per scrivere i file di configurazione. La cosa buona di YAML è il fatto che supporta più tipi di dati come List s, Map se tipi scalari .

Gli elementi in un elenco YAML sono definiti utilizzando il carattere "-" e condividono tutti lo stesso livello di rientro:

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

A titolo di confronto, l'equivalente basato sulle proprietà utilizza gli indici:

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

Per ulteriori esempi, non esitare a dare un'occhiata al nostro articolo su come definire elenchi e mappe utilizzando YAML e file di proprietà.

È un dato di fatto, la natura gerarchica di YAML migliora notevolmente la leggibilità rispetto ai file delle proprietà . Un'altra caratteristica interessante di YAML è la possibilità di definire diverse proprietà per diversi profili di molle.

Vale la pena ricordare che Spring Boot fornisce supporto immediato per la configurazione YAML. Per impostazione predefinita, Spring Boot carica le proprietà di configurazione da application.yml all'avvio senza alcun lavoro aggiuntivo.

3. Associare un elenco YAML a un elenco semplice di oggetti

Spring Boot fornisce l' annotazione @ConfigurationProperties per semplificare la logica di mappatura dei dati di configurazione esterni in un modello a oggetti .

In questa sezione, utilizzeremo @ConfigurationProperties per associare un elenco YAML a un elenco .

Iniziamo definendo un semplice elenco in application.yml :

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

Quindi, creeremo un semplice POJO ApplicationProps per mantenere la logica di associazione del nostro elenco YAML a un elenco dioggetti:

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

La classe ApplicationProps deve essere decorata con @ConfigurationProperties per esprimere l'intenzione di mappare tutte le proprietà YAML con il prefisso specificato a un oggetto di ApplicationProps .

Per legare l' elenco dei profili dobbiamo solo definire un campo di tipo List e l' annotazione @ConfigurationProperties si occuperà del resto.

Si noti che registriamo la classe ApplicationProps come un normale bean Spring utilizzando @Component . Di conseguenza, possiamo iniettarlo in altre classi allo stesso modo di qualsiasi altro bean Spring.

Infine, iniettiamo il bean ApplicationProps in una classe di test e verifichiamo se l' elenco YAML dei nostri profili è correttamente inserito come elenco :

@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. Associazione di elenchi YAML a elenchi complessi

Ora, cerchiamo di immersione più profonda e vedere come iniettare liste nidificate YAML in complesso strutturato Lista s .

Per prima cosa, aggiungiamo alcuni elenchi annidati a 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

In questo esempio, legheremo la proprietà props a un List . Allo stesso modo, mapperemo gli utenti in un elenco di oggetti utente .

Dal momento che ogni elemento del puntelli ingresso detiene le chiavi diverse, allora possiamo iniettare come un elenco di Map s . Assicurati di controllare il nostro articolo su come iniettare una mappa da un file YAML in Spring Boot .

Tuttavia , nel caso degli utenti , tutti gli elementi condividono le stesse chiavi, quindi per semplificarne la mappatura, potrebbe essere necessario creare una classe utente dedicata per incapsulare le chiavi come campi:

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

Ora verifichiamo che i nostri elenchi YAML annidati siano mappati correttamente:

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

In questo tutorial, abbiamo imparato come mappare le liste YAML in Java Lista s. Abbiamo anche verificato come associare elenchi complessi a POJO personalizzati.

Come sempre, il codice sorgente completo di questo articolo è disponibile su GitHub.