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

SpringBoot 3.3.6中@ConfigurationProperties构造注入对象为Null的问题

SpringBoot 3.3.6 升级后 ApplicationContextRunner 测试构造注入 KafkaProperties 为 Null 的解决方案

以下是针对问题的具体修复步骤:

1. 显式添加 @ConstructorBinding 注解

SpringBoot 3.x 对 @ConfigurationProperties 的构造注入要求更严格,尤其是在 ApplicationContextRunner 这类轻量测试上下文中,必须显式标注@ConstructorBinding来启用构造函数绑定。修改你的配置属性类:

@ConfigurationProperties(prefix = "your.wrapper.prefix")
@ConstructorBinding // 新增注解
public class KafkaPropertiesWrapper {
    private final KafkaProperties kafkaProperties;

    public KafkaPropertiesWrapper(KafkaProperties kafkaProperties) {
        this.kafkaProperties = kafkaProperties;
    }

    // 对应的 getter 方法
}

2. 在测试配置中启用 ConfigurationProperties

确保测试配置类显式启用配置属性支持,避免测试上下文遗漏相关处理器:

@Configuration
@EnableConfigurationProperties({KafkaPropertiesWrapper.class, KafkaProperties.class})
public class TestAppConfig {
    // 自定义Bean可在此定义
}

随后在 ApplicationContextRunner 中加载该配置类:

ApplicationContextRunner runner = new ApplicationContextRunner()
        .withUserConfiguration(TestAppConfig.class)
        .withConfiguration(AutoConfigurations.of(KafkaAutoConfiguration.class))
        .withPropertyValues("spring.kafka.bootstrap-servers=localhost:9092");

3. 确保自动配置类被正确加载

KafkaProperties 由 KafkaAutoConfiguration 自动创建,测试中必须确保该自动配置类被包含在上下文里。通过 AutoConfigurations.of() 显式指定,避免轻量测试上下文自动扫描遗漏。

4. 排查构造注入时机问题(备选验证方案)

如果以上方法无效,可能是测试上下文的Bean初始化顺序导致KafkaProperties未提前创建。可临时切换为Setter注入验证:

@ConfigurationProperties(prefix = "your.wrapper.prefix")
public class KafkaPropertiesWrapper {
    private KafkaProperties kafkaProperties;

    @Autowired
    public void setKafkaProperties(KafkaProperties kafkaProperties) {
        this.kafkaProperties = kafkaProperties;
    }

    // 对应的 getter 方法
}

注意:此方案仅作为验证手段,推荐优先使用构造注入+@ConstructorBinding的规范写法。

内容的提问来源于stack exchange,提问作者Paul Beckett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 17:42:35