From dcc1521eab853265ae0fee180ec47a44e3cea7e0 Mon Sep 17 00:00:00 2001 From: Artem Shubovych Date: Thu, 18 Sep 2025 21:30:40 +1000 Subject: [PATCH 1/3] Only register the Swagger annotation imports for the corresponding annotationLibrary --- .../codegen/languages/AbstractJavaCodegen.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index fef3a3824cb7..41801a0413af 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -595,9 +595,13 @@ public void processOpts() { } // imports for pojos - importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); - importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); - importMapping.put("Schema", "io.swagger.v3.oas.annotations.media.Schema"); + if (AnnotationLibrary.SWAGGER1.equals(getAnnotationLibrary())) { + importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); + importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); + } else if (AnnotationLibrary.SWAGGER2.equals(getAnnotationLibrary())) { + importMapping.put("Schema", "io.swagger.v3.oas.annotations.media.Schema"); + } + importMapping.put("BigDecimal", "java.math.BigDecimal"); importMapping.put("JsonDeserialize", "com.fasterxml.jackson.databind.annotation.JsonDeserialize"); importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty"); From b4880123f325fa6d971c1cb25d02523a2e41969e Mon Sep 17 00:00:00 2001 From: Artem Shubovych Date: Thu, 18 Sep 2025 23:01:17 +1000 Subject: [PATCH 2/3] Fix the issue in a specific generator --- .../codegen/languages/AbstractJavaCodegen.java | 10 +++------- .../codegen/languages/JavaClientCodegen.java | 4 ++++ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java index 41801a0413af..fef3a3824cb7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/AbstractJavaCodegen.java @@ -595,13 +595,9 @@ public void processOpts() { } // imports for pojos - if (AnnotationLibrary.SWAGGER1.equals(getAnnotationLibrary())) { - importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); - importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); - } else if (AnnotationLibrary.SWAGGER2.equals(getAnnotationLibrary())) { - importMapping.put("Schema", "io.swagger.v3.oas.annotations.media.Schema"); - } - + importMapping.put("ApiModelProperty", "io.swagger.annotations.ApiModelProperty"); + importMapping.put("ApiModel", "io.swagger.annotations.ApiModel"); + importMapping.put("Schema", "io.swagger.v3.oas.annotations.media.Schema"); importMapping.put("BigDecimal", "java.math.BigDecimal"); importMapping.put("JsonDeserialize", "com.fasterxml.jackson.databind.annotation.JsonDeserialize"); importMapping.put("JsonProperty", "com.fasterxml.jackson.annotation.JsonProperty"); diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java index 5a847d0afc14..43767dc58d00 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaClientCodegen.java @@ -1088,6 +1088,10 @@ public CodegenModel fromModel(String name, Schema model) { } } + if (!AnnotationLibrary.SWAGGER2.equals(getAnnotationLibrary())) { + codegenModel.imports.remove("Schema"); + } + return codegenModel; } From 19d2ea21b369d41ac464ccdb0f2beab49d4ed0b7 Mon Sep 17 00:00:00 2001 From: Artem Shubovych Date: Fri, 19 Sep 2025 20:43:02 +1000 Subject: [PATCH 3/3] Add unit test --- .../codegen/java/JavaClientCodegenTest.java | 60 ++++++++++++++++++- .../resources/3_0/java/native/issue21991.yaml | 29 +++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/java/native/issue21991.yaml diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java index fd0e7271c9f7..da4e3735b8cc 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java @@ -3481,6 +3481,64 @@ public void callNativeServiceWithEmptyResponseSync() throws IOException { ); } + @Test + public void annotationLibraryDoesNotCauseImportConflicts() throws IOException { + Map properties = new HashMap<>(); + properties.put("annotationLibrary", "none"); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName(JAVA_GENERATOR) + .setLibrary(JavaClientCodegen.NATIVE) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/java/native/issue21991.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + + Map files = generator.opts(clientOptInput).generate().stream() + .collect(Collectors.toMap(File::getName, Function.identity())); + + File apiFile = files.get("Schema.java"); + assertNotNull(apiFile); + + JavaFileAssert.assertThat(apiFile).fileDoesNotContain( + "import io.swagger.v3.oas.annotations.media.Schema;" + ); + } + + @Test + public void annotationLibraryGeneratesCorrectImports() throws IOException { + Map properties = new HashMap<>(); + properties.put("annotationLibrary", "swagger2"); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName(JAVA_GENERATOR) + .setLibrary(JavaClientCodegen.NATIVE) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/java/native/issue21991.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + final ClientOptInput clientOptInput = configurator.toClientOptInput(); + DefaultGenerator generator = new DefaultGenerator(); + + Map files = generator.opts(clientOptInput).generate().stream() + .collect(Collectors.toMap(File::getName, Function.identity())); + + File apiFile = files.get("Schema.java"); + assertNotNull(apiFile); + + JavaFileAssert.assertThat(apiFile).fileContains( + "import io.swagger.v3.oas.annotations.media.Schema;" + ); + } + /** * This checks that the async client is not affected by this fix. @@ -3924,4 +3982,4 @@ public void oneOfWithInnerModelTest() { } assertTrue(speciesSeen); } -} \ No newline at end of file +} diff --git a/modules/openapi-generator/src/test/resources/3_0/java/native/issue21991.yaml b/modules/openapi-generator/src/test/resources/3_0/java/native/issue21991.yaml new file mode 100644 index 000000000000..eef776934dae --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/java/native/issue21991.yaml @@ -0,0 +1,29 @@ +openapi: 3.0.3 +info: + title: Example Hello API + description: '' + version: v1 +servers: + - url: http://localhost + description: Global Endpoint +paths: + /v1/emptyResponse: + get: + operationId: empty + description: returns an empty response + responses: + 200: + description: Successful operation + content: + application/json: + schema: + $ref: '#/components/schemas/Schema' + 204: + description: Empty response +components: + schemas: + Schema: + type: object + properties: + name: + type: string