From 08be6be059fe37e16063ecea0d779c2f17f213d7 Mon Sep 17 00:00:00 2001 From: translatenix <119817707+translatenix@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:08:20 -0700 Subject: [PATCH] codegen-java/kotlin: Support Spring Boot 3.x instead of 2.x (#729) Motivation: In Spring Boot 3.0, the annotation type `org.springframework.boot.context.properties.ConstructorBinding` was deprecated in favor of `org.springframework.boot.context.properties.bind.ConstructorBinding`. In 3.2, the old annotation type was removed. As of 3.0, a `@ConstructorBinding` annotation is no longer required/recommended for configuration classes with a single public constructor. Changes: Remove generation of `@ConstructorBinding` annotations in codegen-java and codegen-kotlin. Result: - Generated code is compatible with Spring Boot 3.x. (Verified with locally updated pkl-spring.) - Generated code is no longer compatible with Spring Boot 2.x. To use Pkl 0.27 and later with Spring Boot 2.x, use Pkl 0.26's code generator. - Fixes #139. --- .../main/kotlin/org/pkl/codegen/java/JavaCodeGenerator.kt | 4 ---- .../kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt | 7 ++----- .../kotlin/org/pkl/codegen/kotlin/KotlinCodeGenerator.kt | 4 ---- .../org/pkl/codegen/kotlin/KotlinCodeGeneratorTest.kt | 7 ++----- 4 files changed, 4 insertions(+), 18 deletions(-) diff --git a/pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/JavaCodeGenerator.kt b/pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/JavaCodeGenerator.kt index 8f22e461..76cfd20e 100644 --- a/pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/JavaCodeGenerator.kt +++ b/pkl-codegen-java/src/main/kotlin/org/pkl/codegen/java/JavaCodeGenerator.kt @@ -493,10 +493,6 @@ class JavaCodeGenerator( } fun generateSpringBootAnnotations(builder: TypeSpec.Builder) { - builder.addAnnotation( - ClassName.get("org.springframework.boot.context.properties", "ConstructorBinding") - ) - if (isModuleClass) { builder.addAnnotation( ClassName.get("org.springframework.boot.context.properties", "ConfigurationProperties") diff --git a/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt b/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt index a4eb1239..51c5a082 100644 --- a/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt +++ b/pkl-codegen-java/src/test/kotlin/org/pkl/codegen/java/JavaCodeGeneratorTest.kt @@ -1484,7 +1484,6 @@ class JavaCodeGeneratorTest { assertThat(javaCode) .contains( """ - |@ConstructorBinding |@ConfigurationProperties |public final class Mod { """ @@ -1498,7 +1497,6 @@ class JavaCodeGeneratorTest { ) .contains( """ - | @ConstructorBinding | @ConfigurationProperties("server") | public static final class Server { """ @@ -1512,13 +1510,12 @@ class JavaCodeGeneratorTest { """ .trimMargin() ) + .doesNotContain("@ConstructorBinding") // not worthwhile to add spring & spring boot dependency just so that this test can compile // their annotations val javaCodeWithoutSpringAnnotations = - javaCode.deleteLines { - it.contains("ConstructorBinding") || it.contains("ConfigurationProperties") - } + javaCode.deleteLines { it.contains("ConfigurationProperties") } assertThat(javaCodeWithoutSpringAnnotations).compilesSuccessfully() } diff --git a/pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/KotlinCodeGenerator.kt b/pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/KotlinCodeGenerator.kt index 423d881b..6e1de95e 100644 --- a/pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/KotlinCodeGenerator.kt +++ b/pkl-codegen-kotlin/src/main/kotlin/org/pkl/codegen/kotlin/KotlinCodeGenerator.kt @@ -449,10 +449,6 @@ class KotlinCodeGenerator( } fun generateSpringBootAnnotations(builder: TypeSpec.Builder) { - builder.addAnnotation( - ClassName("org.springframework.boot.context.properties", "ConstructorBinding") - ) - if (isModuleClass) { builder.addAnnotation( ClassName("org.springframework.boot.context.properties", "ConfigurationProperties") diff --git a/pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/KotlinCodeGeneratorTest.kt b/pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/KotlinCodeGeneratorTest.kt index f6a194c7..1c0486fa 100644 --- a/pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/KotlinCodeGeneratorTest.kt +++ b/pkl-codegen-kotlin/src/test/kotlin/org/pkl/codegen/kotlin/KotlinCodeGeneratorTest.kt @@ -1427,7 +1427,6 @@ class KotlinCodeGeneratorTest { assertThat(kotlinCode) .contains( """ - |@ConstructorBinding |@ConfigurationProperties |data class Mod( | val server: Server @@ -1436,7 +1435,6 @@ class KotlinCodeGeneratorTest { ) .contains( """ - | @ConstructorBinding | @ConfigurationProperties("server") | data class Server( | val port: Long, @@ -1444,13 +1442,12 @@ class KotlinCodeGeneratorTest { """ .trimMargin() ) + .doesNotContain("@ConstructorBinding") // not worthwhile to add spring & spring boot dependency just so that this test can compile // their annotations val kotlinCodeWithoutSpringAnnotations = - kotlinCode.deleteLines { - it.contains("ConstructorBinding") || it.contains("ConfigurationProperties") - } + kotlinCode.deleteLines { it.contains("ConfigurationProperties") } assertThat(kotlinCodeWithoutSpringAnnotations).compilesSuccessfully() }