@PropertySource dengan File YAML di Spring Boot

1. Ikhtisar

Dalam tutorial singkat ini, kami akan menunjukkan cara membaca file properti YAML menggunakan anotasi @PropertySource di Spring Boot.

2. @PropertySource dan Format YAML

Spring Boot memiliki dukungan yang bagus untuk konfigurasi eksternal. Juga, dimungkinkan untuk menggunakan berbagai cara dan format untuk membaca properti di aplikasi Spring Boot out-of-the-box.

Namun, secara default, @PropertySource tidak memuat file YAML . Fakta ini secara eksplisit disebutkan dalam dokumentasi resmi.

Jadi, jika kita ingin menggunakan anotasi @PropertySource dalam aplikasi kita, kita harus tetap menggunakan file properti standar . Atau kita bisa menerapkan sendiri potongan puzzle yang hilang!

3. Custom PropertySourceFactory

Mulai Musim Semi 4.3, @PropertySource dilengkapi dengan atribut pabrik . Kita bisa memanfaatkannya untuk menyediakan implementasi kustom kita dari PropertySourceFactory , yang akan menangani pemrosesan file YAML .

Ini lebih mudah dari kedengarannya! Mari kita lihat bagaimana melakukan ini:

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

Seperti yang bisa kita lihat, itu cukup dengan mengimplementasikan satu metode createPropertySource .

Dalam implementasi kustom kami, pertama, kami menggunakan YamlPropertiesFactoryBean untuk mengonversi sumber daya dalam format YAML ke objek java.util.Properties .

Kemudian, kami hanya mengembalikan instance baru PropertiesPropertySource , yang merupakan pembungkus yang memungkinkan Spring membaca properti yang diurai.

4. @PropertySource dan YAML dalam Aksi

Sekarang mari kita gabungkan semua bagian dan lihat bagaimana menggunakannya dalam praktik.

Pertama, mari buat file YAML sederhana - foo.yml :

yaml: name: foo aliases: - abc - xyz

Selanjutnya, mari buat kelas properti dengan @ConfigurationProperties dan gunakan YamlPropertySourceFactory kustom kami :

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

Dan terakhir, mari verifikasi bahwa properti diinjeksi dengan benar :

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

Singkatnya, dalam tutorial singkat ini, pertama-tama kami menunjukkan betapa mudahnya membuat PropertySourceFactory kustom . Setelah itu, kami mempresentasikan cara meneruskan implementasi kustom ini ke @PropertySource menggunakan atribut pabriknya .

Akibatnya, kami berhasil memuat file properti YAML ke aplikasi Spring Boot kami .

Seperti biasa, semua contoh kode tersedia di GitHub.