来自配置Yaml的绑定映射

时间:2019-10-20 13:56:02

标签: java spring-boot configuration yaml

在春季启动项目中,我试图从yaml文件绑定地图。我已经尝试了大多数解决方案来绑定地图,但是遇到以下错误:

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

正如您在配置类上看到的那样,我通过lombok获得了getter / setter,而内部类是静态类。

@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,我已经拥有所有必需的getter和setter方法。我的配置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 :(得分:0)

如果您确实希望密钥为order.createorder.place,则必须将它们指定为"[order.create]""[order.place]",以避开句点。否则,您应该只能使用createplace

答案 1 :(得分:0)

您需要将它们用方括号Relaxed Binding括在双引号中

  

绑定到Map属性时,如果键包含小写字母数字字符或-以外的任何其他字符,则需要使用方括号表示法,以便保留原始值。如果键没有被[]包围,则会删除所有非字母数字或-的字符。

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

  

有时,用@ConfigurationProperties注释的类可能不适用于扫描,例如,如果您正在开发自己的自动配置。在这种情况下,您可以指定要在任何@Configuration类上处理的类型的列表

答案 2 :(得分:0)

我不知道为什么会有这个问题,并想尝试一下他们引入了ConstructorBinding的最新Spring Boot版本2.2.0。

我将配置类更改为以下版本并已修复。

@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;
    }
}