Рубрики
Без рубрики

@PropertySource с файлами YAML в весенней загрузке

Краткое и практическое руководство по обработке файлов YAML с помощью @PropertySource в Spring Boot.

Автор оригинала: Krzysztof Woyke.

1. Обзор

В этом кратком руководстве мы покажем, как прочитать файл свойств YAML с помощью аннотации @PropertySource в Spring Boot.

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

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

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

Итак, если мы хотим использовать аннотацию @PropertySource в нашем приложении, нам нужно придерживаться стандартных свойств файлов. Или мы можем сами реализовать недостающий фрагмент головоломки!

3. Пользовательский ресурс свойств

Начиная с весны 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.Свойства объект .

Затем мы просто вернули новый экземпляр PropertiesPropertySource , который является оболочкой , позволяющей Spring считывать проанализированные свойства.

4. @PropertySource и YAML в действии

Давайте теперь сложим все части воедино и посмотрим, как их использовать на практике.

Во – первых, давайте создадим простой файл YAML – foo.yml :

yaml:
  name: foo
  aliases:
    - abc
    - xyz

Далее, давайте создадим класс свойств с @ConfigurationProperties и используем наш пользовательский Yaml PropertySourceFactory:

@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 , используя его атрибут factory .

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

Как обычно, все примеры кода доступны на GitHub .