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.
This commit is contained in:
translatenix
2024-10-25 14:08:20 -07:00
committed by GitHub
parent 8fa3acf32f
commit 08be6be059
4 changed files with 4 additions and 18 deletions

View File

@@ -493,10 +493,6 @@ class JavaCodeGenerator(
} }
fun generateSpringBootAnnotations(builder: TypeSpec.Builder) { fun generateSpringBootAnnotations(builder: TypeSpec.Builder) {
builder.addAnnotation(
ClassName.get("org.springframework.boot.context.properties", "ConstructorBinding")
)
if (isModuleClass) { if (isModuleClass) {
builder.addAnnotation( builder.addAnnotation(
ClassName.get("org.springframework.boot.context.properties", "ConfigurationProperties") ClassName.get("org.springframework.boot.context.properties", "ConfigurationProperties")

View File

@@ -1484,7 +1484,6 @@ class JavaCodeGeneratorTest {
assertThat(javaCode) assertThat(javaCode)
.contains( .contains(
""" """
|@ConstructorBinding
|@ConfigurationProperties |@ConfigurationProperties
|public final class Mod { |public final class Mod {
""" """
@@ -1498,7 +1497,6 @@ class JavaCodeGeneratorTest {
) )
.contains( .contains(
""" """
| @ConstructorBinding
| @ConfigurationProperties("server") | @ConfigurationProperties("server")
| public static final class Server { | public static final class Server {
""" """
@@ -1512,13 +1510,12 @@ class JavaCodeGeneratorTest {
""" """
.trimMargin() .trimMargin()
) )
.doesNotContain("@ConstructorBinding")
// not worthwhile to add spring & spring boot dependency just so that this test can compile // not worthwhile to add spring & spring boot dependency just so that this test can compile
// their annotations // their annotations
val javaCodeWithoutSpringAnnotations = val javaCodeWithoutSpringAnnotations =
javaCode.deleteLines { javaCode.deleteLines { it.contains("ConfigurationProperties") }
it.contains("ConstructorBinding") || it.contains("ConfigurationProperties")
}
assertThat(javaCodeWithoutSpringAnnotations).compilesSuccessfully() assertThat(javaCodeWithoutSpringAnnotations).compilesSuccessfully()
} }

View File

@@ -449,10 +449,6 @@ class KotlinCodeGenerator(
} }
fun generateSpringBootAnnotations(builder: TypeSpec.Builder) { fun generateSpringBootAnnotations(builder: TypeSpec.Builder) {
builder.addAnnotation(
ClassName("org.springframework.boot.context.properties", "ConstructorBinding")
)
if (isModuleClass) { if (isModuleClass) {
builder.addAnnotation( builder.addAnnotation(
ClassName("org.springframework.boot.context.properties", "ConfigurationProperties") ClassName("org.springframework.boot.context.properties", "ConfigurationProperties")

View File

@@ -1427,7 +1427,6 @@ class KotlinCodeGeneratorTest {
assertThat(kotlinCode) assertThat(kotlinCode)
.contains( .contains(
""" """
|@ConstructorBinding
|@ConfigurationProperties |@ConfigurationProperties
|data class Mod( |data class Mod(
| val server: Server | val server: Server
@@ -1436,7 +1435,6 @@ class KotlinCodeGeneratorTest {
) )
.contains( .contains(
""" """
| @ConstructorBinding
| @ConfigurationProperties("server") | @ConfigurationProperties("server")
| data class Server( | data class Server(
| val port: Long, | val port: Long,
@@ -1444,13 +1442,12 @@ class KotlinCodeGeneratorTest {
""" """
.trimMargin() .trimMargin()
) )
.doesNotContain("@ConstructorBinding")
// not worthwhile to add spring & spring boot dependency just so that this test can compile // not worthwhile to add spring & spring boot dependency just so that this test can compile
// their annotations // their annotations
val kotlinCodeWithoutSpringAnnotations = val kotlinCodeWithoutSpringAnnotations =
kotlinCode.deleteLines { kotlinCode.deleteLines { it.contains("ConfigurationProperties") }
it.contains("ConstructorBinding") || it.contains("ConfigurationProperties")
}
assertThat(kotlinCodeWithoutSpringAnnotations).compilesSuccessfully() assertThat(kotlinCodeWithoutSpringAnnotations).compilesSuccessfully()
} }