Spring Boot中消除application.yml重复配置键,直接映射对象列表的方法
解决Spring Boot配置中重复
tasks键的问题 你的问题根源在于@ConfigurationProperties(prefix = "tasks")和类中private List<TaskEntry> tasks;的组合,导致Spring Boot会去寻找tasks.tasks这个路径来绑定配置。要实现你想要的扁平化YAML结构,只需要调整配置类的绑定方式即可,下面提供两种简洁的方案:
方案一:使用构造函数绑定(推荐)
这种方式更符合Spring Boot的现代配置绑定规范,且不需要额外的属性名调整:
@Configuration @ConfigurationProperties(prefix = "tasks") @ConstructorBinding // 启用构造函数绑定 @Getter // 只需要Getter,因为属性是不可变的 public class TaskConfiguration { private final List<TaskEntry> tasks; // 通过构造函数接收列表参数,Spring会自动绑定prefix下的列表 public TaskConfiguration(List<TaskEntry> tasks) { this.tasks = tasks; } @Getter @Setter public static class TaskEntry { private String name; private String url; private String cronExpression; } }
注意:如果你的Spring Boot版本低于2.2,构造函数绑定需要额外配置;另外,确保在你的主启动类上添加@EnableConfigurationProperties(TaskConfiguration.class),或者让TaskConfiguration被组件扫描到(比如添加@Component注解)。
方案二:调整属性名为value
如果不想用构造函数绑定,可以把类中的列表属性名改为value,Spring Boot会默认将prefix对应的节点绑定到value属性:
@Configuration @ConfigurationProperties(prefix = "tasks") @Getter @Setter public class TaskConfiguration { // 用value作为属性名,匹配prefix下的直接列表 private List<TaskEntry> value; @Getter @Setter public static class TaskEntry { private String name; private String url; private String cronExpression; } }
之后你就可以使用目标格式的YAML配置了:
tasks: - name: A url: http://localhosta cronExpression: 1 2 3 4 5 A - name: B url: http://localhostb cronExpression: 1 2 3 4 5 B
两种方案都能解决你的问题,推荐使用构造函数绑定,因为它支持不可变配置,更安全也更符合Spring Boot的最佳实践。
内容的提问来源于stack exchange,提问作者Robert Strauch
相关产品推荐
相关产品推荐

