Skip to content

Commit bb12527

Browse files
committed
fix(kotlin-spring): use Jackson 3 annotation package in model imports
When useJackson3=true, generated model source files still imported from com.fasterxml.jackson.annotation (Jackson 2). The importMapping in KotlinSpringServerCodegen was hardcoded to the Jackson 2 package. Now derives the annotation package from the useJackson3 flag, consistent with how build files already handled it. Also adds the missing tools.jackson.core:jackson-annotations dependency to all Spring Boot 4 build templates and fixes the hardcoded YAMLMapper import in homeController.mustache.
1 parent 41d25c0 commit bb12527

17 files changed

Lines changed: 81 additions & 18 deletions

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/KotlinSpringServerCodegen.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -492,15 +492,16 @@ public void processOpts() {
492492
importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty");
493493

494494
// Jackson import mappings
495-
importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue");
496-
importMapping.put("JsonCreator", "com.fasterxml.jackson.annotation.JsonCreator");
497-
importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty");
498-
importMapping.put("JsonSubTypes", "com.fasterxml.jackson.annotation.JsonSubTypes");
499-
importMapping.put("JsonTypeInfo", "com.fasterxml.jackson.annotation.JsonTypeInfo");
500-
importMapping.put("JsonIgnoreProperties", "com.fasterxml.jackson.annotation.JsonIgnoreProperties");
495+
String jacksonAnnotationPkg = isUseJackson3() ? JACKSON3_PACKAGE : JACKSON2_PACKAGE;
496+
importMapping.put("JsonValue", jacksonAnnotationPkg + ".annotation.JsonValue");
497+
importMapping.put("JsonCreator", jacksonAnnotationPkg + ".annotation.JsonCreator");
498+
importMapping.put("JsonProperty", jacksonAnnotationPkg + ".annotation.JsonProperty");
499+
importMapping.put("JsonSubTypes", jacksonAnnotationPkg + ".annotation.JsonSubTypes");
500+
importMapping.put("JsonTypeInfo", jacksonAnnotationPkg + ".annotation.JsonTypeInfo");
501+
importMapping.put("JsonIgnoreProperties", jacksonAnnotationPkg + ".annotation.JsonIgnoreProperties");
501502
// import JsonCreator if JsonProperty is imported
502503
// used later in recursive import in postProcessingModels
503-
importMapping.put("com.fasterxml.jackson.annotation.JsonProperty", "com.fasterxml.jackson.annotation.JsonCreator");
504+
importMapping.put(jacksonAnnotationPkg + ".annotation.JsonProperty", jacksonAnnotationPkg + ".annotation.JsonCreator");
504505

505506
if (isUseJackson3()) {
506507
// Override databind imports for Jackson 3

modules/openapi-generator/src/main/resources/kotlin-spring/homeController.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import org.springframework.context.annotation.Bean
44
import org.springframework.stereotype.Controller
55
import org.springframework.web.bind.annotation.RequestMapping
66
{{#sourceDocumentationProvider}}
7-
import com.fasterxml.jackson.dataformat.yaml.YAMLMapper
7+
import {{jacksonPackage}}.dataformat.yaml.YAMLMapper
88
import org.springframework.beans.factory.annotation.Value
99
import org.springframework.core.io.Resource
1010
import org.springframework.util.StreamUtils

modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/buildGradle-sb4-Kts.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ dependencies {
4646

4747
implementation("com.google.code.findbugs:jsr305:3.0.2")
4848
{{#useJackson3}}
49+
implementation("tools.jackson.core:jackson-annotations")
4950
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
5051
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
5152
implementation("tools.jackson.module:jackson-module-kotlin")

modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-boot/pom-sb4.mustache

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,12 @@
158158
<artifactId>jsr305</artifactId>
159159
<version>${findbugs-jsr305.version}</version>
160160
</dependency>
161+
{{#useJackson3}}
162+
<dependency>
163+
<groupId>{{jacksonPackage}}.core</groupId>
164+
<artifactId>jackson-annotations</artifactId>
165+
</dependency>
166+
{{/useJackson3}}
161167
<dependency>
162168
<groupId>{{jacksonPackage}}.dataformat</groupId>
163169
<artifactId>jackson-dataformat-yaml</artifactId>

modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/buildGradle-sb4-Kts.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies {
5454

5555
implementation("com.google.code.findbugs:jsr305:3.0.2")
5656
{{#useJackson3}}
57+
implementation("tools.jackson.core:jackson-annotations")
5758
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
5859
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
5960
implementation("tools.jackson.module:jackson-module-kotlin")

modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-cloud/pom-sb4.mustache

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,12 @@
183183
<artifactId>spring-boot-starter-oauth2-client</artifactId>
184184
</dependency>
185185
{{/hasAuthMethods}}
186+
{{#useJackson3}}
187+
<dependency>
188+
<groupId>{{jacksonPackage}}.core</groupId>
189+
<artifactId>jackson-annotations</artifactId>
190+
</dependency>
191+
{{/useJackson3}}
186192
<dependency>
187193
<groupId>{{jacksonPackage}}.dataformat</groupId>
188194
<artifactId>jackson-dataformat-yaml</artifactId>

modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/buildGradle-sb4-Kts.mustache

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ dependencies {
5454

5555
implementation("com.google.code.findbugs:jsr305:3.0.2")
5656
{{#useJackson3}}
57+
implementation("tools.jackson.core:jackson-annotations")
5758
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
5859
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
5960
implementation("tools.jackson.module:jackson-module-kotlin")

modules/openapi-generator/src/main/resources/kotlin-spring/libraries/spring-declarative-http-interface/pom-sb4.mustache

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@
179179
<artifactId>spring-boot-starter-oauth2-client</artifactId>
180180
</dependency>
181181
{{/hasAuthMethods}}
182+
{{#useJackson3}}
183+
<dependency>
184+
<groupId>{{jacksonPackage}}.core</groupId>
185+
<artifactId>jackson-annotations</artifactId>
186+
</dependency>
187+
{{/useJackson3}}
182188
<dependency>
183189
<groupId>{{jacksonPackage}}.dataformat</groupId>
184190
<artifactId>jackson-dataformat-yaml</artifactId>

modules/openapi-generator/src/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4825,6 +4825,42 @@ public void shouldGenerateSpringBoot4PomWithJackson3Deps() throws IOException {
48254825
assertFileNotContains(pomPath, "com.fasterxml.jackson.module");
48264826
}
48274827

4828+
@Test
4829+
public void shouldGenerateJackson3AnnotationImportsInModels() throws IOException {
4830+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
4831+
output.deleteOnExit();
4832+
String outputPath = output.getAbsolutePath().replace('\\', '/');
4833+
4834+
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/petstore.yaml");
4835+
final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen();
4836+
codegen.setOpenAPI(openAPI);
4837+
codegen.setOutputDir(output.getAbsolutePath());
4838+
4839+
codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_SPRING_BOOT4, "true");
4840+
codegen.additionalProperties().put(AbstractKotlinCodegen.USE_JACKSON_3, "true");
4841+
codegen.additionalProperties().put(DOCUMENTATION_PROVIDER, DocumentationProvider.NONE.toCliOptValue());
4842+
codegen.additionalProperties().put(ANNOTATION_LIBRARY, AnnotationLibrary.NONE.toCliOptValue());
4843+
4844+
ClientOptInput input = new ClientOptInput();
4845+
input.openAPI(openAPI);
4846+
input.config(codegen);
4847+
4848+
DefaultGenerator generator = new DefaultGenerator();
4849+
generator.setGenerateMetadata(false);
4850+
generator.opts(input).generate();
4851+
4852+
// Model files must use Jackson 3 annotation package
4853+
Path petModelPath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pet.kt");
4854+
assertFileContains(petModelPath, "tools.jackson.annotation.JsonProperty");
4855+
assertFileNotContains(petModelPath, "com.fasterxml.jackson.annotation");
4856+
4857+
// Enum model with @JsonValue/@JsonCreator must also use Jackson 3
4858+
Path orderModelPath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Order.kt");
4859+
assertFileContains(orderModelPath, "tools.jackson.annotation.JsonValue");
4860+
assertFileContains(orderModelPath, "tools.jackson.annotation.JsonCreator");
4861+
assertFileNotContains(orderModelPath, "com.fasterxml.jackson.annotation");
4862+
}
4863+
48284864
@Test
48294865
public void shouldDefaultToJackson3WhenSpringBoot4Enabled() throws IOException {
48304866
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();

samples/server/petstore/kotlin-springboot-4/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ dependencies {
2929
implementation("org.springframework.boot:spring-boot-starter-webmvc")
3030

3131
implementation("com.google.code.findbugs:jsr305:3.0.2")
32+
implementation("tools.jackson.core:jackson-annotations")
3233
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
3334
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
3435
implementation("tools.jackson.module:jackson-module-kotlin")

0 commit comments

Comments
 (0)