Автор оригинала: 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 .