Java Records搭配@ConfigurationProperties注解使用报错该如何解决
问题根因
你遇到的报错是因为Spring把你的Record配置类识别成了普通Bean,尝试从容器注入构造参数,而没有走配置文件绑定逻辑,具体原因有3个:
- 不应该给配置类加
@Component注解:加了之后Spring会将其作为普通组件注册,构造参数会被当成依赖注入需求,自然找不到int类型的Bean @ConstructorBinding注解位置错误:Spring Boot 2.5.x版本中,需要将该注解放到Record类上才能启用构造函数配置绑定,放在自定义构造函数上不生效- 没有显式启用配置属性类:
@ConfigurationProperties标注的类需要通过对应注解启用才会被Spring识别为配置类
正确配置方式
步骤1:调整配置类代码
移除@Component注解,将@ConstructorBinding移到类上,同时建议将基本类型int改为包装类型Integer,避免空判断失效:
@ConfigurationProperties("cache") @ConstructorBinding public record MyConfig(Integer validity) { public MyConfig(Integer validity) { this.validity = Optional.ofNullable(validity).orElse(0); } }
步骤2:启用配置属性类
在启动类上添加@EnableConfigurationProperties注解,指定你的配置类:
@SpringBootApplication @EnableConfigurationProperties(MyConfig.class) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
如果项目有多个配置属性类,也可以使用@ConfigurationPropertiesScan注解扫描指定包下的所有配置类:
@SpringBootApplication @ConfigurationPropertiesScan("com.yourproject.config") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
补充说明
如果后续升级到Spring Boot 3.x版本,不需要再添加@ConstructorBinding注解,Spring会自动识别Record类的构造函数做配置绑定。
内容的提问来源于stack exchange,提问作者MrNobody
相关产品推荐
相关产品推荐

