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.