You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:43:50