Spring Boot+Kotlin中@ConfigurationProperties配置类注入失败求助
解决Spring Boot Kotlin数据类@ConfigurationProperties与@ConstructorBinding注入失败问题
问题原因
你的报错核心是:ApiConfiguration被Spring当成了普通Bean处理,而非配置属性类。虽然启动类加了@EnableConfigurationProperties(ApiConfiguration::class),但如果该类处于@SpringBootApplication默认的组件扫描路径下(同包或子包),Spring的@ComponentScan会优先把它识别为普通Bean,尝试通过构造函数注入String类型的依赖(这根本不存在),从而触发报错。
解决方案
方案1:添加@ConfigurationPropertiesScan注解(推荐)
在启动类上添加@ConfigurationPropertiesScan,明确告诉Spring扫描并识别配置属性类,避免被当成普通Bean处理。如果配置类和启动类同包,直接加注解即可;如果不在同包,指定basePackages参数:
@ConfigurationPropertiesScan // 同包下无需指定basePackages,跨包则添加basePackages = ["你的配置类所在包路径"] @EnableConfigurationProperties(ApiConfiguration::class) @SpringBootApplication class SpringdemoApplication fun main(args: Array<String>) { runApplication<SpringdemoApplication>(*args) }
方案2:将配置类移出组件扫描范围
把ApiConfiguration放到@SpringBootApplication默认扫描路径之外的包中,这样@ComponentScan不会扫描到它,Spring会通过@EnableConfigurationProperties正确识别为配置属性类。
方案3:移除@ConstructorBinding(不推荐,仅作备选)
如果不需要构造函数绑定,可以改用Setter注入方式,将数据类的val改为var,并移除@ConstructorBinding:
@ConfigurationProperties("api") data class ApiConfiguration( var clientId: String = "", var url: String = "", var key: String = "" )
这种方式下,Spring会通过Setter自动绑定配置值,无需构造函数处理。
额外检查点
- 确保
ApiConfiguration上没有误加@Component或@Configuration注解,否则会强制Spring将其作为普通Bean处理。 - 确认
pom.xml或build.gradle中已经引入spring-boot-starter依赖(默认已包含配置属性处理逻辑)。
内容的提问来源于stack exchange,提问作者Thilo Schwarz
相关产品推荐
相关产品推荐

