Чтение из YAML в список Java объектов в Spring Boot


Примеры чтения коллекции свойств из файла 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.




К сожалению, не доступен сервер mySQL