Spring Boot使用@ConfigurationProperties搭配@Data无法读取yaml配置问题咨询
修复方案
你遇到的空指针问题本质是KafkaConfig的注册不规范、注入时机和Bean初始化顺序冲突导致的,按以下步骤修改即可:
1. 规范Kafka配置类注册
@ConfigurationProperties 修饰的类需要被Spring上下文扫描到才能正常注入,两种合法配置方式二选一即可:
方式一(推荐):给配置类加@Component注解
直接将配置类注册为Spring Bean,无需额外配置:
@Component @ConfigurationProperties("kafka") @Data public class KafkaConfig { private String topic; private String event; }
方式二:在启动类开启配置属性扫描
如果不想给配置类加@Component,就在你的项目启动类(标注@SpringBootApplication的类)上增加@EnableConfigurationProperties注解指定配置类:
@SpringBootApplication @EnableConfigurationProperties(KafkaConfig.class) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
你已经使用了@Data注解,会自动生成getter/setter,不需要手动编写属性读写方法,不影响配置注入
2. 修正KafkaProducerBeans的注入逻辑
你当前代码同时使用了字段@Autowired注入和构造器注入,冗余且容易触发初始化顺序问题,两种修正方案二选一即可:
方案一:保留构造器注入,删除冗余@Autowired
Spring 4.3及以上版本,单构造器的Bean会自动注入构造器参数,不需要加@Autowired:
@Component public class KafkaProducerBeans { private final KafkaConfig kafkaConfig; public KafkaProducerBeans(KafkaConfig kafkaConfig) { this.kafkaConfig = kafkaConfig; } @Bean(name = "kafkaTestClient") public String getData() { return kafkaConfig.getTopic(); } }
方案二(更稳妥,避免顺序问题):直接在@Bean方法参数中注入
不需要定义类成员变量,直接把KafkaConfig作为@Bean方法的入参,Spring会自动完成注入,完全不会出现空指针:
@Component public class KafkaProducerBeans { @Bean(name = "kafkaTestClient") public String getData(KafkaConfig kafkaConfig) { return kafkaConfig.getTopic(); } }
3. 配置文件校验
确保你的application.yml放在src/main/resources目录下,缩进格式正确(你当前贴的配置缩进符合要求,无需修改)。如果你的项目用了多环境配置,确认当前激活的profile对应的配置文件里也有对应kafka配置即可。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

