Skip to content

Commit 6f6293c

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 41d25c0 commit 6f6293c

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
@@ -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/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/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)