Skip to content

Commit 023d654

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 023d654

17 files changed

Lines changed: 165 additions & 39 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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ dependencies {
4646

4747
implementation("com.google.code.findbugs:jsr305:3.0.2")
4848
{{#useJackson3}}
49-
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
50-
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
51-
implementation("tools.jackson.module:jackson-module-kotlin")
49+
val jackson3Version = "3.1.0"
50+
implementation("tools.jackson.core:jackson-annotations:$jackson3Version")
51+
implementation("tools.jackson.dataformat:jackson-dataformat-yaml:$jackson3Version")
52+
implementation("tools.jackson.dataformat:jackson-dataformat-xml:$jackson3Version")
53+
implementation("tools.jackson.module:jackson-module-kotlin:$jackson3Version")
5254
{{/useJackson3}}
5355
{{^useJackson3}}
5456
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")

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

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
<swagger-ui.version>5.17.14</swagger-ui.version>{{/springDocDocumentationProvider}}{{/useSwaggerUI}}{{^springDocDocumentationProvider}}{{#swagger1AnnotationLibrary}}
1212
<swagger-annotations.version>1.6.6</swagger-annotations.version>{{/swagger1AnnotationLibrary}}{{#swagger2AnnotationLibrary}}
1313
<swagger-annotations.version>2.2.28</swagger-annotations.version>{{/swagger2AnnotationLibrary}}{{/springDocDocumentationProvider}}
14-
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
14+
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>{{#useJackson3}}
15+
<jackson3.version>3.1.0</jackson3.version>{{/useJackson3}}
1516
<jakarta-annotation.version>3.0.0</jakarta-annotation.version>
1617
<kotlin-test-junit5.version>2.2.0</kotlin-test-junit5.version>
1718

@@ -158,22 +159,45 @@
158159
<artifactId>jsr305</artifactId>
159160
<version>${findbugs-jsr305.version}</version>
160161
</dependency>
162+
{{#useJackson3}}
163+
<dependency>
164+
<groupId>{{jacksonPackage}}.core</groupId>
165+
<artifactId>jackson-annotations</artifactId>
166+
<version>${jackson3.version}</version>
167+
</dependency>
168+
<dependency>
169+
<groupId>{{jacksonPackage}}.dataformat</groupId>
170+
<artifactId>jackson-dataformat-yaml</artifactId>
171+
<version>${jackson3.version}</version>
172+
</dependency>
173+
<dependency>
174+
<groupId>{{jacksonPackage}}.dataformat</groupId>
175+
<artifactId>jackson-dataformat-xml</artifactId>
176+
<version>${jackson3.version}</version>
177+
</dependency>
178+
<dependency>
179+
<groupId>{{jacksonPackage}}.module</groupId>
180+
<artifactId>jackson-module-kotlin</artifactId>
181+
<version>${jackson3.version}</version>
182+
</dependency>
183+
{{/useJackson3}}{{^useJackson3}}
161184
<dependency>
162185
<groupId>{{jacksonPackage}}.dataformat</groupId>
163186
<artifactId>jackson-dataformat-yaml</artifactId>
164187
</dependency>
165188
<dependency>
166189
<groupId>{{jacksonPackage}}.dataformat</groupId>
167190
<artifactId>jackson-dataformat-xml</artifactId>
168-
</dependency>{{^useJackson3}}
191+
</dependency>
169192
<dependency>
170193
<groupId>com.fasterxml.jackson.datatype</groupId>
171194
<artifactId>jackson-datatype-jsr310</artifactId>
172-
</dependency>{{/useJackson3}}
195+
</dependency>
173196
<dependency>
174197
<groupId>{{jacksonPackage}}.module</groupId>
175198
<artifactId>jackson-module-kotlin</artifactId>
176199
</dependency>
200+
{{/useJackson3}}
177201
{{#useBeanValidation}}
178202
<!-- Bean Validation API support -->
179203
<dependency>

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,11 @@ dependencies {
5454

5555
implementation("com.google.code.findbugs:jsr305:3.0.2")
5656
{{#useJackson3}}
57-
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
58-
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
59-
implementation("tools.jackson.module:jackson-module-kotlin")
57+
val jackson3Version = "3.1.0"
58+
implementation("tools.jackson.core:jackson-annotations:$jackson3Version")
59+
implementation("tools.jackson.dataformat:jackson-dataformat-yaml:$jackson3Version")
60+
implementation("tools.jackson.dataformat:jackson-dataformat-xml:$jackson3Version")
61+
implementation("tools.jackson.module:jackson-module-kotlin:$jackson3Version")
6062
{{/useJackson3}}
6163
{{^useJackson3}}
6264
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")

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

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
</swagger-annotations.version>{{/swagger1AnnotationLibrary}}{{#swagger2AnnotationLibrary}}
1818
<swagger-annotations.version>2.2.28
1919
</swagger-annotations.version>{{/swagger2AnnotationLibrary}}{{/springDocDocumentationProvider}}
20-
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
20+
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>{{#useJackson3}}
21+
<jackson3.version>3.1.0</jackson3.version>{{/useJackson3}}
2122
<jakarta-annotation.version>3.0.0</jakarta-annotation.version>
2223
<kotlin-test-junit5.version>2.2.0</kotlin-test-junit5.version>
2324

@@ -183,22 +184,45 @@
183184
<artifactId>spring-boot-starter-oauth2-client</artifactId>
184185
</dependency>
185186
{{/hasAuthMethods}}
187+
{{#useJackson3}}
188+
<dependency>
189+
<groupId>{{jacksonPackage}}.core</groupId>
190+
<artifactId>jackson-annotations</artifactId>
191+
<version>${jackson3.version}</version>
192+
</dependency>
193+
<dependency>
194+
<groupId>{{jacksonPackage}}.dataformat</groupId>
195+
<artifactId>jackson-dataformat-yaml</artifactId>
196+
<version>${jackson3.version}</version>
197+
</dependency>
198+
<dependency>
199+
<groupId>{{jacksonPackage}}.dataformat</groupId>
200+
<artifactId>jackson-dataformat-xml</artifactId>
201+
<version>${jackson3.version}</version>
202+
</dependency>
203+
<dependency>
204+
<groupId>{{jacksonPackage}}.module</groupId>
205+
<artifactId>jackson-module-kotlin</artifactId>
206+
<version>${jackson3.version}</version>
207+
</dependency>
208+
{{/useJackson3}}{{^useJackson3}}
186209
<dependency>
187210
<groupId>{{jacksonPackage}}.dataformat</groupId>
188211
<artifactId>jackson-dataformat-yaml</artifactId>
189212
</dependency>
190213
<dependency>
191214
<groupId>{{jacksonPackage}}.dataformat</groupId>
192215
<artifactId>jackson-dataformat-xml</artifactId>
193-
</dependency>{{^useJackson3}}
216+
</dependency>
194217
<dependency>
195218
<groupId>com.fasterxml.jackson.datatype</groupId>
196219
<artifactId>jackson-datatype-jsr310</artifactId>
197-
</dependency>{{/useJackson3}}
220+
</dependency>
198221
<dependency>
199222
<groupId>{{jacksonPackage}}.module</groupId>
200223
<artifactId>jackson-module-kotlin</artifactId>
201224
</dependency>
225+
{{/useJackson3}}
202226
{{#useBeanValidation}}
203227
<!-- Bean Validation API support -->
204228
<dependency>

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,11 @@ dependencies {
5454

5555
implementation("com.google.code.findbugs:jsr305:3.0.2")
5656
{{#useJackson3}}
57-
implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
58-
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
59-
implementation("tools.jackson.module:jackson-module-kotlin")
57+
val jackson3Version = "3.1.0"
58+
implementation("tools.jackson.core:jackson-annotations:$jackson3Version")
59+
implementation("tools.jackson.dataformat:jackson-dataformat-yaml:$jackson3Version")
60+
implementation("tools.jackson.dataformat:jackson-dataformat-xml:$jackson3Version")
61+
implementation("tools.jackson.module:jackson-module-kotlin:$jackson3Version")
6062
{{/useJackson3}}
6163
{{^useJackson3}}
6264
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")

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

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
</swagger-annotations.version>{{/swagger1AnnotationLibrary}}{{#swagger2AnnotationLibrary}}
1818
<swagger-annotations.version>2.2.28
1919
</swagger-annotations.version>{{/swagger2AnnotationLibrary}}{{/springDocDocumentationProvider}}
20-
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>
20+
<findbugs-jsr305.version>3.0.2</findbugs-jsr305.version>{{#useJackson3}}
21+
<jackson3.version>3.1.0</jackson3.version>{{/useJackson3}}
2122
<jakarta-annotation.version>3.0.0</jakarta-annotation.version>
2223
<kotlin-test-junit5.version>2.2.0</kotlin-test-junit5.version>
2324

@@ -179,22 +180,45 @@
179180
<artifactId>spring-boot-starter-oauth2-client</artifactId>
180181
</dependency>
181182
{{/hasAuthMethods}}
183+
{{#useJackson3}}
184+
<dependency>
185+
<groupId>{{jacksonPackage}}.core</groupId>
186+
<artifactId>jackson-annotations</artifactId>
187+
<version>${jackson3.version}</version>
188+
</dependency>
189+
<dependency>
190+
<groupId>{{jacksonPackage}}.dataformat</groupId>
191+
<artifactId>jackson-dataformat-yaml</artifactId>
192+
<version>${jackson3.version}</version>
193+
</dependency>
194+
<dependency>
195+
<groupId>{{jacksonPackage}}.dataformat</groupId>
196+
<artifactId>jackson-dataformat-xml</artifactId>
197+
<version>${jackson3.version}</version>
198+
</dependency>
199+
<dependency>
200+
<groupId>{{jacksonPackage}}.module</groupId>
201+
<artifactId>jackson-module-kotlin</artifactId>
202+
<version>${jackson3.version}</version>
203+
</dependency>
204+
{{/useJackson3}}{{^useJackson3}}
182205
<dependency>
183206
<groupId>{{jacksonPackage}}.dataformat</groupId>
184207
<artifactId>jackson-dataformat-yaml</artifactId>
185208
</dependency>
186209
<dependency>
187210
<groupId>{{jacksonPackage}}.dataformat</groupId>
188211
<artifactId>jackson-dataformat-xml</artifactId>
189-
</dependency>{{^useJackson3}}
212+
</dependency>
190213
<dependency>
191214
<groupId>com.fasterxml.jackson.datatype</groupId>
192215
<artifactId>jackson-datatype-jsr310</artifactId>
193-
</dependency>{{/useJackson3}}
216+
</dependency>
194217
<dependency>
195218
<groupId>{{jacksonPackage}}.module</groupId>
196219
<artifactId>jackson-module-kotlin</artifactId>
197220
</dependency>
221+
{{/useJackson3}}
198222
{{#useBeanValidation}}
199223
<!-- Bean Validation API support -->
200224
<dependency>

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: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,11 @@ 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.dataformat:jackson-dataformat-yaml")
33-
implementation("tools.jackson.dataformat:jackson-dataformat-xml")
34-
implementation("tools.jackson.module:jackson-module-kotlin")
32+
val jackson3Version = "3.1.0"
33+
implementation("tools.jackson.core:jackson-annotations:$jackson3Version")
34+
implementation("tools.jackson.dataformat:jackson-dataformat-yaml:$jackson3Version")
35+
implementation("tools.jackson.dataformat:jackson-dataformat-xml:$jackson3Version")
36+
implementation("tools.jackson.module:jackson-module-kotlin:$jackson3Version")
3537
implementation("org.springframework.data:spring-data-commons")
3638
implementation("jakarta.validation:jakarta.validation-api")
3739
implementation("jakarta.annotation:jakarta.annotation-api:3.0.0")

0 commit comments

Comments
 (0)