Spring Boot bootstrap.yml解析报错,如何按策略条件配置size-limits?
问题描述
我有一个Spring Boot项目的bootstrap.yml配置文件,其中包含这段配置:
producer: session: partition-submission: strategy: size-based size-limits: 10,100
解析该文件时抛出以下错误:
2023-03-31 19:16:02,280 ERROR [main] org.springframework.boot.SpringApplication: Application run failed org.yaml.snakeyaml.scanner.ScannerException: mapping values are not allowed here in 'reader', line 77, column 20: size-limits: 10,100 ^ at org.yaml.snakeyaml.scanner.ScannerImpl.fetchValue(ScannerImpl.java:910)
移除size-limits的缩进后错误消失,在线YAML校验工具提示:nested mappings are not allowed in compact mappings.。文件仅使用空格缩进,无制表符。
我的需求是:仅当strategy为size-based时,才配置并解析size-limits,该如何实现?
解决方案
1. 先修正YAML语法错误
你原来的配置写法违反了YAML语法规则:strategy: size-based是简单的键值对(值为字符串),不能直接在它下面缩进嵌套size-limits——字符串值后无法直接跟子映射。正确写法是把strategy和size-limits放在同一层级,作为partition-submission的子属性:
producer: session: partition-submission: strategy: size-based size-limits: 10,100
2. 实现条件化配置(仅当strategy为size-based时解析size-limits)
方法一:Spring Boot条件注解+配置属性
- 先写配置类绑定
partition-submission下的配置项:
@ConfigurationProperties(prefix = "producer.session.partition-submission") public class PartitionSubmissionProperties { private String strategy; private String sizeLimits; // 生成对应的getter、setter方法 }
- 再写配置类,仅当
strategy为size-based时初始化依赖size-limits的Bean:
@Configuration @EnableConfigurationProperties(PartitionSubmissionProperties.class) public class PartitionSubmissionConfig { @Bean @ConditionalOnProperty( prefix = "producer.session.partition-submission", name = "strategy", havingValue = "size-based" ) public SizeBasedProcessor sizeBasedProcessor(PartitionSubmissionProperties properties) { // 在这里使用properties.getSizeLimits()完成初始化逻辑 return new SizeBasedProcessor(properties.getSizeLimits()); } // 其他策略对应的处理器可参照此逻辑,修改havingValue即可 }
这样只有当配置中的strategy设为size-based时,SizeBasedProcessor才会被创建,size-limits的值也会被正确绑定;如果是其他策略,该Bean不会初始化,size-limits即便配置了也不会被使用。
方法二:Spring Profiles(适配多策略场景)
如果不同策略对应的配置差异较大,用Profiles更清晰:
- 在主
bootstrap.yml中编写通用配置:
producer: session: partition-submission: strategy: size-based
- 新建专属配置文件
bootstrap-size-based.yml,存放size-based策略的独有配置:
producer: session: partition-submission: size-limits: 10,100
- 启动时激活对应profile即可,比如在
application.properties中配置:
spring.profiles.active=size-based
或者在启动命令中指定:
java -jar your-app.jar --spring.profiles.active=size-based
这种方式下,只有激活size-based profile时,size-limits的配置才会加载生效。
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

