You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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更清晰:

  1. 在主bootstrap.yml中编写通用配置:
producer:
  session:
    partition-submission:
      strategy: size-based
  1. 新建专属配置文件bootstrap-size-based.yml,存放size-based策略的独有配置:
producer:
  session:
    partition-submission:
      size-limits: 10,100
  1. 启动时激活对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 14:52:09