在春季启动项目中,我试图从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);
}
}
答案 0 :(得分:0)
如果您确实希望密钥为order.create
和order.place
,则必须将它们指定为"[order.create]"
和"[order.place]"
,以避开句点。否则,您应该只能使用create
和place
。
答案 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;
}
}