Spring Boot Upgrade до 2.2.6 - Невозможно привязать свойства yaml к списку объектов - PullRequest
1 голос
/ 02 мая 2020

Я в процессе обновления проекта до Spring Boot 2.2.6. Следующие ошибки компиляции касаются привязки данных свойств yaml к списку объектов -

** Обратите внимание, что проект компилируется в предыдущей версии spring-boot (2.2.1), которую я использовал **

java .lang.IllegalStateException: не удалось загрузить ApplicationContext, вызванный: org.springframework.boot.context.properties.ConfigurationPropertiesBindException: ошибка при создании компонента с именем 'webUiApplication.States': не удалось привязать свойства к 'WebUiApplication.States': prefix = states, ignoreInvalidFields = false, ignoreUnknownFields = true; вложенное исключение - org.springframework.boot.context.properties.bind.BindException: не удалось связать свойства в 'states.defaults' с java .util.List

application.yml

   states:
  defaults:
    -
      postal-code: AL
      name: Alabama
    -
      postal-code: AK
      name: Alaska
    -
      postal-code: AZ
      name: Arizona

Конфигурация

    @Data 
   @Configuration
   @ConfigurationProperties("states")
   public static class States {

      private List<State> defaults;

      private List<State> docVerify;

      private List<State> registration;

  }

POJO

@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@ToString(onlyExplicitlyIncluded = true)
public class State implements ListOption {
   public static final Comparator<State> DISPLAY_COMPARATOR = new ListOption.DisplayComparator<>();

   @NonNull private final String postalCode;

   @NonNull private final String name;

@Override
   @EqualsAndHashCode.Include
   public String getValue() {
      return this.postalCode;
   }

   @Override
   @ToString.Include
   public String getLabel() {
      return String.format("%s - %s", postalCode, name);
   }
}

Сталкивались с сообщениями, в которых участники получили похожую проблему, но не смогли найти решение. Ждем ваших отзывов.

1 Ответ

2 голосов
/ 05 мая 2020

Рефакторинг вашего кода:

Состояния:

@Data

    @Configuration
    @ConfigurationProperties("states")
    @ToString
    @NoArgsConstructor
    public class States {
        private List<State> defaults;
        private List<State> docVerify;
        private List<State> registration;

    }

Состояние:

@Data
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@ToString(onlyExplicitlyIncluded = true)
@NoArgsConstructor
public class State {
    @NonNull
    private String postalCode;

    @NonNull
    private String name;

    @EqualsAndHashCode.Include
    public String getValue() {
        return this.postalCode;
    }

    @ToString.Include
    public String getLabel() {
        return String.format("%s - %s", postalCode, name);
    }
}

application.yaml

states:
  defaults:
    -
      postal-code: AL
      name: Alabama
    -
      postal-code: AK
      name: Alaska
    -
      postal-code: AZ
      name: Arizona

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

...