Обязательная карта из конфига yaml - PullRequest
1 голос
/ 20 октября 2019

В весеннем загрузочном проекте я пытаюсь привязать карту из файла yaml. Я пробовал большинство решений для привязки карты, но получаю следующую ошибку:

    Property: order.events
    Value: null
    Reason: must not be empty
 Action:
 Update your application's configuration

Как вы можете видеть в классе конфигурации, у меня есть getter / setter через lombok, а внутренний класс является статическим классом.

@Data
@Validated
@ConfigurationProperties(prefix = "order", ignoreUnknownFields = false)
public class OrderConfig {

    private String clientKey;
    private String apiVersion;
    private String endpoint;

    @Valid
    @NotEmpty
    private Map<String, Event> events;

    @Data
    public static class Event {

        @NotBlank
        private String action;
        @NotBlank
        private String eventName;
    }
}

Используя lombok, у меня уже есть все необходимые методы получения и установки. Мой файл конфигурации yaml:

    order:
      clientKey: client_1
      apiVersion: 1.0.0
      endpoint: https://www.ordertest.com/api
      events:
        order.create:
          action: track
          eventName: purchase
        order.place:
          action: track
          eventName: purchase

И мой класс приложения:

@SpringBootApplication
@EnableConfigurationProperties(OrderConfig.class)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Ответы [ 3 ]

0 голосов
/ 20 октября 2019

Вам необходимо закодировать их в двойные кавычки в квадратных скобках Relaxed Binding

При связывании со свойствами карты, если ключ содержит что-либо, кроме строчных буквенно-цифровых символов или-, вам нужно использовать скобочные обозначения, чтобы сохранить исходное значение. Если ключ не заключен в [], любые символы, которые не являются буквенно-цифровыми или -, удаляются.

order:
  clientKey: client_1
  apiVersion: 1.0.0
  endpoint: https://www.ordertest.com/api
  events:
    "[order.create]":
      action: track
      eventName: purchase
    "[order.place]":
      action: track
      eventName: purchase

А также вам нужно аннотировать @Configuration в OrderConfig class

Иногда классы, помеченные @ConfigurationProperties, могут не подходить для сканирования, например, если вы разрабатываете собственную автоконфигурацию. В этих случаях вы можете указать список типов для обработки в любом классе @Configuration

0 голосов
/ 21 октября 2019

Я не мог понять, почему у меня возникла эта проблема, и я хотел бы попытаться использовать последнюю загрузочную версию Spring 2.2.0, в которой они представили ConstructorBinding.

Я изменил свой конфигурационный класс на следующую версию и егоисправлено.

@Data
@Validated
@ConstructorBinding
@ConfigurationProperties(prefix = "order", ignoreUnknownFields = false)
public class OrderConfig {

    private final String clientKey;
    private final String apiVersion;
    private final String endpoint;

    @Valid
    @NotEmpty
    private final Map<String, Event> events;

    @Data
    @ConstructorBinding
    public static class Event {

        @NotBlank
        private final String action;
        @NotBlank
        private final String eventName;
    }
}
0 голосов
/ 20 октября 2019

Если вы действительно хотите, чтобы ваши ключи были order.create и order.place, тогда вы должны указать их как "[order.create]" и "[order.place]", чтобы избежать периодов. В противном случае вы сможете работать только с create и place.

...