来自配置 yaml 的绑定映射



在 Spring 启动项目中,我正在尝试从 yaml 文件绑定映射。我已经尝试了大多数解决方案来绑定地图,但出现以下错误:

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

正如您在配置类上看到的那样,我通过龙目岛拥有 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;
}
}

通过使用龙目岛,我已经拥有了所有必要的吸气剂和二传手方法。我的配置 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);
}
}

您需要用带方括号的双引号对它们进行编码 宽松绑定

绑定到 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类进行处理的类型列表

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

我不知道为什么我会遇到这个问题,并想尝试他们引入ConstructorBinding的最新Spring引导版本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;
}
}

最新更新