Kotlin ConfigurationProperties default values are not picked up when nativeRun is used (original) (raw)

spring-boot version: 3.0.2

gradle file from example application:

plugins { id("org.springframework.boot") version "3.0.2" id("io.spring.dependency-management") version "1.1.0" id("org.graalvm.buildtools.native") version "0.9.18" kotlin("jvm") version "1.7.22" kotlin("plugin.spring") version "1.7.22" }

group = "com.example" version = "0.0.1-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_17

repositories { mavenCentral() }

dependencies { implementation("org.springframework.boot:spring-boot-starter-webflux") implementation("com.fasterxml.jackson.module:jackson-module-kotlin") implementation("io.projectreactor.kotlin:reactor-kotlin-extensions") implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor") testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("io.projectreactor:reactor-test") }

tasks.withType { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "17" } }

tasks.withType { useJUnitPlatform() }

Example application:

@SpringBootApplication @EnableConfigurationProperties( AppProperties::class ) class DemoApplication

fun main(args: Array) { runApplication(*args) }

@ConfigurationProperties("app.property") data class AppProperties( var a: Boolean = true, )

@RestController @RequestMapping("/") class TestController(val appProperty: AppProperties) {

@GetMapping()
fun hello(): String {
    return "Hello world: ${appProperty.a}"
}

}

Exception that is thrown when command ./gradlew nativeRun is run:

Caused by: kotlin.reflect.jvm.internal.KotlinReflectionInternalError: This callable does not support a default call: public constructor AppProperties(a: kotlin.Boolean = ...) defined in com.example.demo.AppProperties[DeserializedClassConstructorDescriptor@7f41fb4b]
        at kotlin.reflect.jvm.internal.KCallableImpl.callDefaultMethod$kotlin_reflection(KCallableImpl.kt:164) ~[demo:1.7.22-release-288(1.7.22)]
        at kotlin.reflect.jvm.internal.KCallableImpl.callBy(KCallableImpl.kt:112) ~[demo:1.7.22-release-288(1.7.22)]
        at org.springframework.beans.BeanUtils$KotlinDelegate.instantiateClass(BeanUtils.java:895) ~[na:na]
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:191) ~[na:na]
        at org.springframework.boot.context.properties.bind.ValueObjectBinder$ValueObject.instantiate(ValueObjectBinder.java:178) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.ValueObjectBinder.create(ValueObjectBinder.java:97) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.Binder.create(Binder.java:369) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.Binder.handleBindResult(Binder.java:358) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:344) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.Binder.bind(Binder.java:332) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.Binder.bindOrCreate(Binder.java:324) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.bind.Binder.bindOrCreate(Binder.java:309) ~[demo:3.0.2]
        at org.springframework.boot.context.properties.ConfigurationPropertiesBinder.bindOrCreate(ConfigurationPropertiesBinder.java:100) ~[demo:na]
        at org.springframework.boot.context.properties.ConstructorBound.from(ConstructorBound.java:43) ~[na:na]
        at com.example.demo.AppProperties__BeanDefinitions.getAppPropertiesInstance(AppProperties__BeanDefinitions.java:24) ~[na:na]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainInstanceFromSupplier(AbstractAutowireCapableBeanFactory.java:1225) ~[demo:6.0.4]
        ... 33 common frames omitted

But it works us expected if command ./gradlew bootRun is run.