Iniettare una mappa da un file YAML con Spring

1. Panoramica

In questo rapido tutorial, daremo un'occhiata da vicino a come iniettare una mappa da un file YAML in Spring Boot .

Innanzitutto, inizieremo con un po 'di informazioni sui file YAML in Spring Framework. Quindi, mostreremo, attraverso un esempio pratico, come associare le proprietà YAML a una mappa .

2. File YAML in Spring Framework

L'utilizzo di file YAML per memorizzare i dati di configurazione esterni è una pratica comune tra gli sviluppatori Spring. Fondamentalmente, Spring supporta i documenti YAML come alternativa alle proprietà e utilizza SnakeYAML sotto il cofano per analizzarli .

Senza ulteriori indugi, vediamo come appare un tipico file YAML:

server: port: 8090 application: name: myapplication url: //myapplication.com

Come possiamo vedere, il file YAML è autoesplicativo e più leggibile dall'uomo. È un dato di fatto, YAML fornisce un modo elegante e conciso per memorizzare i dati di configurazione gerarchica.

Per impostazione predefinita, Primavera Boot legge le proprietà di configurazione da application.properties o application.yml all'avvio dell'applicazione. Tuttavia, possiamo usare @PropertySource per caricare un file YAML personalizzato.

Ora che abbiamo familiarità con cosa sia un file YAML, vediamo come inserire proprietà YAML come mappa in Spring Boot.

3. Come iniettare una mappa da un file YAML

Spring Boot ha portato l'esternalizzazione dei dati al livello successivo fornendo un'utile annotazione chiamata @ConfigurationProperties. Questa annotazione viene introdotta per inserire facilmente proprietà esterne dai file di configurazione direttamente negli oggetti Java .

In questa sezione, tratteremo in modo approfondito come associare le proprietà YAML in una classe bean utilizzando l' annotazione @ConfigurationProperties .

Per prima cosa, definiamo alcune proprietà valore-chiave in application.yml :

server: application: name: InjectMapFromYAML url: //injectmapfromyaml.dev description: How To Inject a map from a YAML File in Spring Boot config: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filesystem: - /dev/root - /dev/md2 - /dev/md4 users: root: username: root password: rootpass guest: username: guest password: guestpass

In questo esempio, proveremo a mappare l' applicazione in una semplice mappa. Allo stesso modo, inseriremo i dettagli di configurazione come una mappa , e utenti come una mappa con chiavi String e oggetti appartenenti a una classe definita dall'utente - Credential - come valori .

In secondo luogo, creiamo una classe bean - ServerProperties - per incapsulare la logica di associazione delle nostre proprietà di configurazione a Map s:

@Component @ConfigurationProperties(prefix = "server") public class ServerProperties { private Map application; private Map
    
      config; private Map users; // getters and setters public static class Credential { private String username; private String password; // getters and setters } }
    

Come possiamo vedere, abbiamo decorato la classe ServerProperties con @ConfigurationProperties. In questo modo, diciamo a Spring di mappare tutte le proprietà con il prefisso specificato a un oggetto di ServerProperties .

Ricorda che la nostra app deve essere abilitata anche per le proprietà di configurazione, sebbene ciò venga fatto automaticamente nella maggior parte delle applicazioni Spring Boot.

Infine, testiamo se le nostre proprietà YAML sono correttamente iniettate come Map s:

@RunWith(SpringRunner.class) @SpringBootTest class MapFromYamlIntegrationTest { @Autowired private ServerProperties serverProperties; @Test public void whenYamlFileProvidedThenInjectSimpleMap() { assertThat(serverProperties.getApplication()) .containsOnlyKeys("name", "url", "description"); assertThat(serverProperties.getApplication() .get("name")).isEqualTo("InjectMapFromYAML"); } @Test public void whenYamlFileProvidedThenInjectComplexMap() { assertThat(serverProperties.getConfig()).hasSize(2); assertThat(serverProperties.getConfig() .get("ips") .get(0)).isEqualTo("10.10.10.10"); assertThat(serverProperties.getUsers() .get("root") .getUsername()).isEqualTo("root"); } }

4. @ConfigurationProperties vs @Value

Ora facciamo un rapido confronto tra @ConfigurationProperties e @Value.

Nonostante il fatto che entrambe le annotazioni possano essere utilizzate per iniettare proprietà dai file di configurazione , sono piuttosto diverse. La principale differenza tra queste due annotazioni è che ognuna ha uno scopo diverso.

In breve, @V alue ci consente di iniettare direttamente un particolare valore di proprietà tramite la sua chiave. Tuttavia, l' annotazione @ConfigurationProperties associa più proprietà a un particolare oggetto e fornisce l'accesso alle proprietà tramite l'oggetto mappato.

In generale, Spring consiglia di utilizzare @ConfigurationProperties su @Value quando si tratta di inserire dati di configurazione . @ConfigurationProperties offre un ottimo modo per centralizzare e raggruppare le proprietà di configurazione in un oggetto strutturato che possiamo iniettare in seguito in altri bean.

5. conclusione

Per riassumere, abbiamo prima spiegato come iniettare una mappa da un file YAML in Spring Boot. Quindi, abbiamo evidenziato la differenza tra @ConfigurationProperties e @Value.

Come al solito, il codice sorgente completo dell'articolo è disponibile su GitHub.