Spring Boot 3.0.1中Kotlin @ConfigurationProperties val带默认值失效
Spring Boot 3.0.1 Kotlin @ConfigurationProperties 带默认值的val字段无法生成配置元数据
问题现象
Spring Boot从2.x升级到3.0.1后,Kotlin中使用@ConfigurationProperties时出现场景差异化问题:
- 带/不带默认值的
var字段:配置元数据(spring-configuration-metadata.json)正常生成 - 不带默认值的
val字段:配置元数据正常生成 - 带默认值的
val字段:配置元数据的properties数组为空,无法生成对应配置项
Spring Boot 2.7.x版本中,所有场景(var/val、带/不带默认值)均能正常生成配置元数据。
代码复现
正常示例(带默认值的var)
@ConfigurationProperties(prefix = "cnr.app") data class AppProperties( var name: String = "cma", var version: String = "0.0.1" )
对应生成的spring-configuration-metadata.json包含完整的properties字段。
异常示例(带默认值的val)
@ConfigurationProperties(prefix = "cnr.app") data class AppProperties( val name: String = "cma", val version: String = "0.0.1" )
对应生成的spring-configuration-metadata.json中properties数组为空。
当前环境配置(build.gradle.kts)
configurations { compileOnly { extendsFrom(configurations.annotationProcessor.get()) } } kapt { annotationProcessor("org.springframework.boot.configurationprocessor.ConfigurationMetadataAnnotationProcessor") } tasks { withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> { dependsOn(processResources) } } dependencies { kapt("org.springframework.boot:spring-boot-configuration-processor") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") }
解决方案
方案1:升级Spring Boot版本至3.0.2及以上
该问题是Spring Boot 3.0.1的已知bug,后续版本(如3.0.2)已修复配置元数据处理器对Kotlin带默认值val字段的识别逻辑,升级后无需修改代码即可恢复正常。
方案2:调整数据类构造逻辑(兼容3.0.1版本)
改用显式构造函数绑定,将默认值移至次级构造函数,配合@ConstructorBinding注解让处理器正确识别val字段:
@ConfigurationProperties(prefix = "cnr.app") @ConstructorBinding data class AppProperties( val name: String, val version: String ) { constructor() : this("cma", "0.0.1") }
方案3:修改kapt配置强制生成元数据
在kapt配置中添加参数,强制处理器为所有符合条件的字段生成元数据:
kapt { arguments { arg("spring.configurationprocessor.metadata.always-create", "true") } annotationProcessor("org.springframework.boot.configurationprocessor.ConfigurationMetadataAnnotationProcessor") }
原因分析
Spring Boot 3.0.1的配置元数据处理器在处理Kotlin数据类时,对带默认值的val字段逻辑判断异常:既忽略了构造函数绑定的场景,又因默认值存在跳过了元数据生成逻辑。而2.7.x版本的处理器对Kotlin语法兼容性更好,3.0.2及后续版本修复了该逻辑漏洞。
内容的提问来源于stack exchange,提问作者unD3R
相关产品推荐
相关产品推荐

