@PropertySource з файлами YAML у Spring Boot

1. Огляд

У цьому короткому посібнику ми покажемо, як читати файл властивостей YAML за допомогою анотації @PropertySource у Spring Boot.

2. @PropertySource та формат YAML

Spring Boot має чудову підтримку зовнішньої конфігурації. Крім того, можна використовувати різні способи та формати для читання властивостей програми Spring Boot нестандартно.

Однак за замовчуванням @PropertySource не завантажує файли YAML . Цей факт прямо згадується в офіційній документації.

Отже, якщо ми хочемо використовувати анотацію @PropertySource у нашому додатку, нам потрібно дотримуватися стандартних файлів властивостей . Або ми можемо реалізувати зниклий фрагмент головоломки самі!

3. Спеціальна властивістьSourceFactory

Станом на весну 4.3, @PropertySource поставляється з атрибутом factory . Ми можемо використати його для забезпечення власної реалізації PropertySourceFactory , яка буде обробляти обробку файлів YAML .

Це простіше, ніж здається! Давайте подивимося, як це зробити:

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

Як ми бачимо, досить реалізувати один метод createPropertySource .

По-перше, у нашій користувацькій реалізації ми використовували YamlPropertiesFactoryBean для перетворення ресурсів у форматі YAML у об’єкт java.util.Properties .

Потім ми просто повернули новий екземпляр PropertiesPropertySource , який є обгорткою, що дозволяє Spring читати аналізовані властивості.

4. @PropertySource та YAML у дії

Давайте тепер складемо всі частини разом і подивимося, як використовувати їх на практиці.

Спочатку давайте створимо простий файл YAML - foo.yml :

yaml: name: foo aliases: - abc - xyz

Далі, давайте створимо клас властивостей за допомогою @ConfigurationProperties і використаємо наш власний YamlPropertySourceFactory:

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

І нарешті, давайте перевіримо, що властивості введені належним чином :

@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. Висновок

Підводячи підсумок, у цьому короткому навчальному посібнику ми вперше показали, наскільки легко створити власний PropertySourceFactory . Після цього ми представили, як передати цю спеціальну реалізацію @PropertySource, використовуючи її заводський атрибут.

Отже, нам вдалося успішно завантажити файл властивостей YAML у нашу програму Spring Boot .

Як завжди, усі приклади коду доступні на GitHub.