Причина: элементы были оставлены свободными - PullRequest
0 голосов
/ 17 июня 2019

Как загрузить список объектов из файла конфигурации yml в приложении java springboot?

Я уже пробовал несколько источников:

configuration-properties-in-spring-boot

пример свойств настройки весенней загрузки

SpringBoot 2 элементы остались несвязанными

Стек: Java 11, SpringBoot 2.1.4, Lombok, файл конфигурации в формате .yml.

Я попытался реализовать простой @Component, который будет загружать данные из файла конфигурации.

Значения конфигурации:

allowed:
  - first-crossroad: ONE
    second-crossroad: TWO
    third-crossroad: TWO
    fourth-crossroad: THREE
  - first-crossroad: ONE
    second-crossroad: THREE
    third-crossroad: TWO
    fourth-crossroad: ONE

Класс Java для загрузки данных:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "")
@Data
public class AllowedCrossroads {

  private List<CrossroadCombination> allowed;
}

Определение объекта Java CrossroadCombination:

@Data
@Builder
@AllArgsConstructor
public class CrossroadCombination {

  private String firstCrossroad;
  private String secondCrossroad;
  private String thirdCrossroad;
  private String fourthCrossroad;
}

Я ожидал загрузки значений во время выполнения приложения.Но я получаю сообщение об ошибке:

Свойство: разрешено [0] .first-crossroad Значение: ONE Источник: путь к классу [application.yml]: 644: 17 Причина: элементы [позволено [0] .first-crossroad, позволили [0] .fourth-перекресток, позволили [0] .second-перекресток, позволили [0] .third-перекресток, допускается [1] .first-перекресток, допускаются [1] .fourth-перекресток, позволили [1] .second-перекресток, допускается [1] .third-перекресток, позволил [2] .first-перекрестку, позволил [2] .fourth-перекрестку, позволил [2] .second-перекрестку, позволил [2] .third-перекресток] остались несвязанными.

Ответы [ 2 ]

1 голос
/ 18 июня 2019

(одно из многих) Решение:

  • добавить: @ NoArgsConstructor

в класс Java:

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class CrossroadCombination {

  private String firstCrossroad;
  private String secondCrossroad;
  private String thirdCrossroad;
  private String fourthCrossroad;
}

Пояснение:

Это потому, что когда мы создаем объект, нам нужно иметь пустой объект, а затем заполнить его данными. Вот почему нам не нужен конструктор args.

В любом случае решение от "@Daniel V" тоже правильное, и спасибо за это!

1 голос
/ 17 июня 2019

Вы пробовали использовать библиотеку Java ResourceBundle?

например:

ResourceBundle configApp = ResourceBundle.getBundle("path to your configuration file");

после этого вы можете использовать configApp примерно так:

configApp.getString("first-crossroad");

Вы можете попробовать это и сказать мне, как это происходит.

EDIT:

Данные в вашем файле конфигурации, если вы планируете использовать ResourceBundle, должны выглядеть следующим образом:

allowed=[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]

«[]» не обязательно, но делает его более читабельным

тогда вы называете это так:

configApp.getObject ( "разрешено");

, который будет хранить это так:

[first-crossroad= ONE, second-crossroad= TWO, third-crossroad= TWO,fourth-crossroad= THREE,first-crossroad= ONE, second-crossroad= THREE,third-crossroad= TWO, fourth-crossroad= ONE]

тогда вы можете привести это к массиву или поиграть с ним вот так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...