Примеры чтения коллекции свойств из файла YAML или файлов свойств приложения в список Java объектов в Spring Boot.
Обзор
Эта заметка содержит примеры чтения списка или коллекций из файла YAML или файла свойств в виде экземпляров Java List или Set в Spring Boot.
Мы уже знаем, что аннотация @ConfigurationProperties в Spring Boot отображает конфигурации на основе YAML или свойств в экземпляры Java-компонентов, и позволяет делать это очень гибко. Чтобы узнать больше об использовании данной аннотации, мы рекомендуем прочитать Использование @ConfigurationProperties в Spring Boot.
Мы уже знаем, что аннотация @ConfigurationProperties annotation в Spring Boot отображает конфигурации на основе YAML или свойств в экземпляры Java-компонентов, и выполняет это очень гибко. Чтобы узнать больше об аннотации, мы рекомендуем прочитать Using @ConfigurationProperties in Spring Boot.
Списки в YAML или файлах свойств
Давайте рассмотрим различные типы списков, которые могут отображаться в файле YAML. Простые списки в YAML
property:
list:
- 1
- 2
- 4
- 6
Файл YAML определяет список из 4 элементов. Вместо этого аналогичная конфигурация может быть выражена через эквивалентный файл свойств.
property.list[0]=1
property.list[1]=2
property.list[2]=4
property.list[3]=6
Список карт в YAML
property:
listOfMaps:
-
key1: valueA
key2: valueB
key3: valueC
-
key1: valueD
key4: valueE
Мы ясно видим, что элементы в списке содержат случайные поля и поэтому представляют собой список карт.
Список объектов в YAML
property:
listOfObjects:
-
field1: valueA
field2: valueB
-
field1: valueD
field2: valueE
Элементы списка конфигурации YAML содержат точно такие же поля. Таким образом, он представляет собой список объектов.
В следующих разделах мы прочитаем эти списки в Java Beans с помощью аннотации @ConfigurationProperties. При этом вместо файла YAML мы можем использовать любой аналогичный файл свойств, и аннотация @ConfigurationProperties будет работать во всех случаях.
YAML в простой Java List
Пусть в нашем YAML-файле есть список простых элементов, как показано в следующем фрагменте.
config:
env:
- dev
- qa
- prod
Чтобы прочитать эту конфигурацию, мы создадим класс и будем использовать аннотацию @ConfigurationProperties вместе с префиксом config.
@Configuration
@ConfigurationProperties(prefix = "config")
public class PlainListProperties {
private List<String> env;
// Конструктор, Геттер и Сеттер методы
// toString()
}
Мы определили простой список элементов типа String, имя которого соответствует имени списка YAML.
* Простые свойства на основе списка Java
env: [dev, qa, prod]
Мы распечатали заполненный экземпляр bean-компонента с помощью метода @PostConstruct, и он показывает, что список прочитан правильно.
Из YAML в список объектов типа Java Map
Списки в YAML (или даже в файле свойств) не всегда будут содержать простые элементы, они могут быть более сложными. Например, список несвязанных групп полей.
config:
miscellaneous:
-
poll-frequency: 20
timeout: 10
max-retry: 3
-
log-erros: true
fail-on-errors: false
-
publish-metrics: true
metrics-frequency: 30
Мы видим, что у каждого элемента в списке есть группа не связанных между собой полей. Чтобы прочитать конфигурацию как List<Map>, мы создадим класс свойств конфигурации и будем использовать префикс.
@Configuration
@ConfigurationProperties(prefix = "config")
public class PlainListProperties {
private List<String> env;
// Конструктор, Геттер и Сеттер методы
// toString()
}
Обратите внимание, что в нашем списке ожидается тип элементов Map<String, Object>, который точно соответствует имеющейся у нас конфигурации.
miscellaneous:
{poll-frequency=20, timeout=10, max-retry=3}
{log-erros=true, fail-on-errors=false}
{publish-metrics=true, metrics-frequency=30}
Распечатав список с использованием хорошо отформатированного метода toString(), мы видим, что список карт из конфигурации YAML правильно отображается в список объектов типа Java Map.
YAML в список Java объектов
Давайте предположим, что в нашей конфигурации YAML есть список «сервисов». Все элементы списка имеют одинаковые поля. Вот почему мы можем отобразить список как список Java объектов.
config:
services:
-
name: login-service
url: http://login.example.com
-
name: data-service
url: http://data.example.com
Чтобы прочитать конфигурацию, мы создадим класс Java, аннотируем его с помощью @ConfigurationProperties и добавим требуемый префикс.
@Configuration
@ConfigurationProperties(prefix = "config")
public class ListOfObjectProperties {
private List<<meta charset="utf-8">Service> services;
// Constructor, Getter, and Setter methods
// toString()
public static class Service {
private String name;
private String url;
// Constructor, Getter, and Setter methods
}
}
Обратите внимание, что мы используем вложенный внутренний класс (Service) для привязки свойств каждого элемента в списке конфигурации. После запуска давайте напечатаем bean-компонент, используя хорошо отформатированный метод toString().
* Список объектов Java на основе свойств сервисов:
name: login-service, url: http://login.example.com
name: data-service, url: http://data.example.com
Что показывает, что список в конфигурации YAML правильно отображается в Java List пользовательских объектов.
YAML в Java Set
До сих пор в наших примерах использовались отображения на основе Java List. Однако мы также можем отображать списки из конфигураций YAML или свойств в экземпляр Java Set.
Преимущество использования Set над Java List состоит в том, что реализации Set уникальны по своей природе. Таким образом, это позволит удалить все дубликаты из списка.
Чтобы продемонстрировать простое отображение списка YAML в Java Set, мы перепишем предыдущий пример, используя Set.
<meta charset="utf-8">@Configuration
@ConfigurationProperties(prefix = "config")
public class SetOfObjectProperties {
private Set<<meta charset="utf-8">Service> services;
// Конструктор, Геттер и Сеттер методы
// toString()
public static class Service {
private String name;
private String url;
// Конструктор, Геттер и Сеттер методы
}
}
По сравнению с примером из предыдущего раздела, единственное отличие состоит в типе переменной службы, которая теперь является Set.
* Java Set of Object based Properties services:
name: login-service, url: http://login.example.com
name: data-service, url: http://data.example.com
Как и ожидалось, список в конфигурации YAML правильно отображается в Java Set.
Резюме
В этой краткой заметке проиллюстрированы различные способы отображения конфигураций YAML или свойств в экземпляры Java List. Мы увидели разные формы списка конфигураций YAML или свойств - простой список, список карт и список объектов. Затем мы создали Java примеры, используя @ConfigurationProperties, чтобы отобразить эти списки конфигураций в обычный список Java, список карт или список Java объектов.
В последнем разделе мы увидели, что мы также можем отобразить конфигурации YAML или свойств в Java Set. При этом мы всегда получаем список уникальных элементов.
Полный исходный код примеров, используемых в этом руководстве, вы можете найти в нашем репозитории Github.