Skip to content

Commit 1303262

Browse files
yonatankarpclaude
andcommitted
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 fixes the hardcoded YAMLMapper import in homeController.mustache. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 00b3413 commit 1303262

9 files changed

Lines changed: 55 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
@@ -498,15 +498,16 @@ public void processOpts() {
498498
importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty");
499499

500500
// Jackson import mappings
501-
importMapping.put("JsonValue", "com.fasterxml.jackson.annotation.JsonValue");
502-
importMapping.put("JsonCreator", "com.fasterxml.jackson.annotation.JsonCreator");
503-
importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty");
504-
importMapping.put("JsonSubTypes", "com.fasterxml.jackson.annotation.JsonSubTypes");
505-
importMapping.put("JsonTypeInfo", "com.fasterxml.jackson.annotation.JsonTypeInfo");
506-
importMapping.put("JsonIgnoreProperties", "com.fasterxml.jackson.annotation.JsonIgnoreProperties");
501+
String jacksonAnnotationPkg = isUseJackson3() ? JACKSON3_PACKAGE : JACKSON2_PACKAGE;
502+
importMapping.put("JsonValue", jacksonAnnotationPkg + ".annotation.JsonValue");
503+
importMapping.put("JsonCreator", jacksonAnnotationPkg + ".annotation.JsonCreator");
504+
importMapping.put("JsonProperty", jacksonAnnotationPkg + ".annotation.JsonProperty");
505+
importMapping.put("JsonSubTypes", jacksonAnnotationPkg + ".annotation.JsonSubTypes");
506+
importMapping.put("JsonTypeInfo", jacksonAnnotationPkg + ".annotation.JsonTypeInfo");
507+
importMapping.put("JsonIgnoreProperties", jacksonAnnotationPkg + ".annotation.JsonIgnoreProperties");
507508
// import JsonCreator if JsonProperty is imported
508509
// used later in recursive import in postProcessingModels
509-
importMapping.put("com.fasterxml.jackson.annotation.JsonProperty", "com.fasterxml.jackson.annotation.JsonCreator");
510+
importMapping.put(jacksonAnnotationPkg + ".annotation.JsonProperty", jacksonAnnotationPkg + ".annotation.JsonCreator");
510511

511512
if (isUseJackson3()) {
512513
// 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/test/java/org/openapitools/codegen/kotlin/spring/KotlinSpringServerCodegenTest.java

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

4876+
@Test
4877+
public void shouldGenerateJackson3AnnotationImportsInModels() throws IOException {
4878+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
4879+
output.deleteOnExit();
4880+
String outputPath = output.getAbsolutePath().replace('\\', '/');
4881+
4882+
final OpenAPI openAPI = TestUtils.parseFlattenSpec("src/test/resources/3_0/petstore.yaml");
4883+
final KotlinSpringServerCodegen codegen = new KotlinSpringServerCodegen();
4884+
codegen.setOpenAPI(openAPI);
4885+
codegen.setOutputDir(output.getAbsolutePath());
4886+
4887+
codegen.additionalProperties().put(KotlinSpringServerCodegen.USE_SPRING_BOOT4, "true");
4888+
codegen.additionalProperties().put(AbstractKotlinCodegen.USE_JACKSON_3, "true");
4889+
codegen.additionalProperties().put(DOCUMENTATION_PROVIDER, DocumentationProvider.NONE.toCliOptValue());
4890+
codegen.additionalProperties().put(ANNOTATION_LIBRARY, AnnotationLibrary.NONE.toCliOptValue());
4891+
4892+
ClientOptInput input = new ClientOptInput();
4893+
input.openAPI(openAPI);
4894+
input.config(codegen);
4895+
4896+
DefaultGenerator generator = new DefaultGenerator();
4897+
generator.setGenerateMetadata(false);
4898+
generator.opts(input).generate();
4899+
4900+
// Model files must use Jackson 3 annotation package
4901+
Path petModelPath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Pet.kt");
4902+
assertFileContains(petModelPath, "tools.jackson.annotation.JsonProperty");
4903+
assertFileNotContains(petModelPath, "com.fasterxml.jackson.annotation");
4904+
4905+
// Enum model with @JsonValue/@JsonCreator must also use Jackson 3
4906+
Path orderModelPath = Paths.get(outputPath + "/src/main/kotlin/org/openapitools/model/Order.kt");
4907+
assertFileContains(orderModelPath, "tools.jackson.annotation.JsonValue");
4908+
assertFileContains(orderModelPath, "tools.jackson.annotation.JsonCreator");
4909+
assertFileNotContains(orderModelPath, "com.fasterxml.jackson.annotation");
4910+
}
4911+
48764912
@Test
48774913
public void shouldDefaultToJackson3WhenSpringBoot4Enabled() throws IOException {
48784914
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();

samples/server/petstore/kotlin-springboot-4/src/main/kotlin/org/openapitools/model/Category.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.openapitools.model
22

33
import java.util.Objects
4-
import com.fasterxml.jackson.annotation.JsonProperty
4+
import tools.jackson.annotation.JsonProperty
55
import jakarta.validation.constraints.DecimalMax
66
import jakarta.validation.constraints.DecimalMin
77
import jakarta.validation.constraints.Email

samples/server/petstore/kotlin-springboot-4/src/main/kotlin/org/openapitools/model/ModelApiResponse.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.openapitools.model
22

33
import java.util.Objects
4-
import com.fasterxml.jackson.annotation.JsonProperty
4+
import tools.jackson.annotation.JsonProperty
55
import jakarta.validation.constraints.DecimalMax
66
import jakarta.validation.constraints.DecimalMin
77
import jakarta.validation.constraints.Email

samples/server/petstore/kotlin-springboot-4/src/main/kotlin/org/openapitools/model/Order.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.openapitools.model
22

33
import java.util.Objects
4-
import com.fasterxml.jackson.annotation.JsonCreator
5-
import com.fasterxml.jackson.annotation.JsonProperty
6-
import com.fasterxml.jackson.annotation.JsonValue
4+
import tools.jackson.annotation.JsonCreator
5+
import tools.jackson.annotation.JsonProperty
6+
import tools.jackson.annotation.JsonValue
77
import jakarta.validation.constraints.DecimalMax
88
import jakarta.validation.constraints.DecimalMin
99
import jakarta.validation.constraints.Email

samples/server/petstore/kotlin-springboot-4/src/main/kotlin/org/openapitools/model/Pet.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package org.openapitools.model
22

33
import java.util.Objects
4-
import com.fasterxml.jackson.annotation.JsonCreator
5-
import com.fasterxml.jackson.annotation.JsonProperty
6-
import com.fasterxml.jackson.annotation.JsonValue
74
import org.openapitools.model.Category
85
import org.openapitools.model.Tag
6+
import tools.jackson.annotation.JsonCreator
7+
import tools.jackson.annotation.JsonProperty
8+
import tools.jackson.annotation.JsonValue
99
import jakarta.validation.constraints.DecimalMax
1010
import jakarta.validation.constraints.DecimalMin
1111
import jakarta.validation.constraints.Email

samples/server/petstore/kotlin-springboot-4/src/main/kotlin/org/openapitools/model/Tag.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.openapitools.model
22

33
import java.util.Objects
4-
import com.fasterxml.jackson.annotation.JsonProperty
4+
import tools.jackson.annotation.JsonProperty
55
import jakarta.validation.constraints.DecimalMax
66
import jakarta.validation.constraints.DecimalMin
77
import jakarta.validation.constraints.Email

samples/server/petstore/kotlin-springboot-4/src/main/kotlin/org/openapitools/model/User.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package org.openapitools.model
22

33
import java.util.Objects
4-
import com.fasterxml.jackson.annotation.JsonProperty
4+
import tools.jackson.annotation.JsonProperty
55
import jakarta.validation.constraints.DecimalMax
66
import jakarta.validation.constraints.DecimalMin
77
import jakarta.validation.constraints.Email

0 commit comments

Comments
 (0)