Spring Boot 3中用Kotlin实现无默认值的@ConfigurationProperties
你的错误点分析
1. @ConstructorBinding 注解使用错误
Spring Boot 3.x 版本中,@ConstructorBinding 注解不能作用在类上,只能用于构造函数。而且对于 Kotlin 的 data class 来说,如果属性用 val 声明(不可变),Spring Boot 3.x 会自动启用构造函数绑定,完全不需要额外添加 @ConstructorBinding 注解。你之前把注解加在类上,才会触发编译错误。
2. lateinit 关键字使用错误
lateinit 只能修饰 var 类型的变量(因为需要后续赋值),如果你用它修饰了 val,或者属性的访问修饰符导致 Kotlin 没有自动生成 getter/setter(比如用了 private),就会出现 Property getter or setter expected 的错误。Spring 的配置绑定要求属性必须具备可访问的 getter/setter,这是核心要求。
正确解决方案
方案一:构造函数绑定(推荐,不可变配置)
用 Kotlin data class 声明配置类,属性用 val 定义,配合 @ConfigurationProperties 即可,无需额外注解:
@ConfigurationProperties(prefix = "your.app") data class AppProperties( val name: String, val version: String )
然后在 Spring Boot 启动类上添加 @ConfigurationPropertiesScan 注解,让框架扫描到这个配置类;或者在启动类上用 @EnableConfigurationProperties(AppProperties::class) 显式启用该配置类。
方案二:可变属性 + lateinit(适合需要后续修改的场景)
如果需要配置属性可变,用 lateinit var 声明,确保属性是 public(默认就是),让 Kotlin 自动生成 getter/setter:
@ConfigurationProperties(prefix = "your.app") class AppProperties { lateinit var name: String lateinit var version: String }
同样需要通过 @ConfigurationPropertiesScan 或 @EnableConfigurationProperties 让框架识别这个类,也可以给类添加 @Component 注解(不推荐,因为外部化配置更适合单独管理)。
内容的提问来源于stack exchange,提问作者gstackoverflow

