@PropertySource med YAML-filer i Spring Boot

1. Oversigt

I denne hurtige vejledning viser vi, hvordan man læser en YAML egenskabsfil ved hjælp af @PropertySource kommentar i Spring Boot.

2. @PropertySource og YAML Format

Spring Boot har god understøttelse af ekstern konfiguration. Det er også muligt at bruge forskellige måder og formater til at læse egenskaberne i Spring Boot-applikationen uden for kassen.

Imidlertid, som standard, @PropertySource indlæser ikke YAML-filer. Denne kendsgerning er udtrykkeligt nævnt i den officielle dokumentation.

Så hvis vi vil bruge @PropertySource kommentar i vores ansøgning, vi skal holde os til standarden ejendomme filer. Eller vi kan selv implementere det manglende puslespil!

3. Brugerdefineret PropertySourceFactory

Fra og med foråret 4.3 @PropertySource følger med fabrik attribut. Vi kan gøre brug af det til give vores brugerdefinerede implementering af PropertySourceFactory, som håndterer YAML-filbehandlingen.

Dette er lettere end det lyder! Lad os se, hvordan man gør dette:

offentlig klasse YamlPropertySourceFactory implementerer PropertySourceFactory {@Override public PropertySource createPropertySource (String name, EncodedResource encodedResource) kaster IOException {YamlPropertiesFactoryBean fabrik = ny YamlPropertiesFactoryBean (); factory.setResources (encodedResource.getResource ()); Egenskaber for egenskaber = fabrik.getObject (); returner nye PropertiesPropertySource (encodedResource.getResource (). getFilename (), egenskaber); }}

Som vi kan se, er det nok at implementere en enkelt createPropertySource metode.

Først i vores brugerdefinerede implementering vi brugte YamlPropertiesFactoryBean at konvertere ressourcerne i YAML-format til java.util.Ejendomme objekt.

Derefter returnerede vi simpelthen en ny forekomst af PropertiesPropertySource , som er en indpakning, der giver Spring mulighed for at læse de analyserede egenskaber.

4. @PropertySource og YAML i aktion

Lad os nu sætte alle brikkerne sammen og se, hvordan vi bruger dem i praksis.

Lad os først oprette en simpel YAML-fil - foo.yml:

yaml: navn: foo aliasser: - abc - xyz

Lad os derefter oprette en egenskabsklasse med @ConfigurationProperties og brug vores brugerdefinerede YamlPropertySourceFactory:

@Configuration @ConfigurationProperties (prefix = "yaml") @PropertySource (værdi = "classpath: foo.yml", fabrik = YamlPropertySourceFactory.class) offentlig klasse YamlFooProperties {private String name; private Liste aliaser; // standard getter og setters}

Og endelig, lad os kontrollere, at egenskaberne er korrekt injiceret:

@RunWith (SpringRunner.class) @SpringBootTest offentlig klasse YamlFooPropertiesIntegrationTest {@Autowired private YamlFooProperties yamlFooProperties; @Test offentlig ugyldig nårFabrikProvidedThenYamlPropertiesInjected () {assertThat (yamlFooProperties.getName ()). IsEqualTo ("foo"); assertThat (yamlFooProperties.getAliases ()). indeholder Exakt ("abc", "xyz"); }}

5. Konklusion

For at opsummere viste vi i denne hurtige vejledning først, hvor let det er at oprette en brugerdefineret PropertySourceFactory . Derefter præsenterede vi, hvordan vi overførte denne brugerdefinerede implementering til @PropertySource ved hjælp af dens fabrik attribut.

Følgelig, vi var i stand til at indlæse YAML-egenskabsfilen med succes i vores Spring Boot-applikation.

Som sædvanligt er alle kodeeksempler tilgængelige på GitHub.