@PropertySource con file YAML in Spring Boot

1. Panoramica

In questo breve tutorial, mostreremo come leggere un file delle proprietà YAML utilizzando l' annotazione @PropertySource in Spring Boot.

2. @PropertySource e formato YAML

Spring Boot ha un ottimo supporto per la configurazione esternalizzata. Inoltre, è possibile utilizzare diversi modi e formati per leggere le proprietà nell'applicazione Spring Boot out-of-the-box.

Tuttavia, per impostazione predefinita, @PropertySource non carica i file YAML . Questo fatto è esplicitamente menzionato nella documentazione ufficiale.

Quindi, se vogliamo utilizzare l' annotazione @PropertySource nella nostra applicazione, dobbiamo attenerci ai file delle proprietà standard . Oppure possiamo implementare noi stessi il pezzo del puzzle mancante!

3. PropertySourceFactory personalizzato

A partire dalla primavera 4.3, @PropertySource viene fornito con l' attributo factory . Possiamo usarlo per fornire la nostra implementazione personalizzata di PropertySourceFactory , che gestirà l'elaborazione del file YAML .

È più facile di quanto sembri! Vediamo come fare:

public class YamlPropertySourceFactory implements PropertySourceFactory { @Override public PropertySource createPropertySource(String name, EncodedResource encodedResource) throws IOException { YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); factory.setResources(encodedResource.getResource()); Properties properties = factory.getObject(); return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties); } }

Come possiamo vedere, è sufficiente implementare un unico metodo createPropertySource .

Nella nostra implementazione personalizzata, in primo luogo, abbiamo utilizzato YamlPropertiesFactoryBean per convertire le risorse in formato YAML nell'oggetto java.util.Properties .

Quindi, abbiamo semplicemente restituito una nuova istanza di PropertiesPropertySource , che è un wrapper che consente a Spring di leggere le proprietà analizzate.

4. @PropertySource e YAML in azione

Mettiamo ora insieme tutti i pezzi e vediamo come usarli nella pratica.

Per prima cosa, creiamo un semplice file YAML - foo.yml :

yaml: name: foo aliases: - abc - xyz

Successivamente, creiamo una classe di proprietà con @ConfigurationProperties e usiamo il nostro YamlPropertySourceFactory personalizzato :

@Configuration @ConfigurationProperties(prefix = "yaml") @PropertySource(value = "classpath:foo.yml", factory = YamlPropertySourceFactory.class) public class YamlFooProperties { private String name; private List aliases; // standard getter and setters }

E infine, verifichiamo che le proprietà siano correttamente iniettate :

@RunWith(SpringRunner.class) @SpringBootTest public class YamlFooPropertiesIntegrationTest { @Autowired private YamlFooProperties yamlFooProperties; @Test public void whenFactoryProvidedThenYamlPropertiesInjected() { assertThat(yamlFooProperties.getName()).isEqualTo("foo"); assertThat(yamlFooProperties.getAliases()).containsExactly("abc", "xyz"); } }

5. conclusione

Per riassumere, in questo rapido tutorial, abbiamo prima mostrato quanto sia facile creare un PropertySourceFactory personalizzato . Successivamente, abbiamo illustrato come passare questa implementazione personalizzata a @PropertySource utilizzando il suo attributo factory .

Di conseguenza, siamo stati in grado di caricare correttamente il file delle proprietà YAML nella nostra applicazione Spring Boot .

Come al solito, tutti gli esempi di codice sono disponibili su GitHub.