【问题标题】:Binding map from config yaml来自配置 yaml 的绑定映射
【发布时间】:2020-02-16 19:12:50
【问题描述】:

在 Spring Boot 项目中,我试图从 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);
    }
}

【问题讨论】:

    标签: java spring-boot configuration yaml


    【解决方案1】:

    如果您真的希望您的密钥为order.createorder.place,那么您必须将它们指定为"[order.create]""[order.place]" 以转义句点。否则,您应该可以只使用 createplace

    【讨论】:

    • 我已经尝试了你的建议来逃避和不带句点的键,但都没有帮助。
    • 您使用的是哪个 Spring 版本?
    【解决方案2】:

    你需要用方括号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
    

    您还需要在OrderConfig 类上注释@Configuration

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

    【讨论】:

      【解决方案3】:

      我不明白为什么我会遇到这个问题,并想试一试最新的 Spring boot 版本 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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-02-16
        • 1970-01-01
        • 2020-10-22
        • 2017-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-05
        • 2021-10-22
        相关资源
        最近更新 更多