diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java index 47dd2b9dd1be..57130e519eda 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java @@ -4623,6 +4623,8 @@ public CodegenOperation fromOperation(String path, !languageSpecificPrimitives.contains(r.baseType)) { imports.add(r.baseType); } + + addImportMappedType(imports, r.dataType); if ("set".equals(r.containerType) && typeMapping.containsKey(r.containerType)) { op.uniqueItems = true; @@ -4868,6 +4870,17 @@ public CodegenOperation fromOperation(String path, return op; } + /** + * Helper method to add an import for a data type if it exists in the importMapping. + * @param imports The set of imports to add to. + * @param dataType The data type to check for a mapping. + */ + protected void addImportMappedType(Set imports, String dataType) { + if (importMapping.containsKey(dataType)) { + imports.add(dataType); + } + } + public void SortParametersByRequiredFlag(List parameters) { Collections.sort(parameters, new Comparator() { @Override @@ -5464,6 +5477,7 @@ public CodegenParameter fromParameter(Parameter parameter, Set imports) if (codegenProperty.complexType != null) { imports.add(codegenProperty.complexType); } + addImportMappedType(imports, codegenParameter.dataType); codegenParameter.pattern = toRegularExpression(parameterSchema.getPattern()); diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache index 2a26a969402f..67bf59b0d1bb 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/ApiClient.mustache @@ -277,9 +277,9 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { {{#useJackson3}} Consumer messageConverters = builder -> { - builder.addCustomConverter(new JacksonJsonHttpMessageConverter(mapper)); + builder.registerDefaults().withJsonConverter(new JacksonJsonHttpMessageConverter(mapper)); {{#withXml}} - builder.addCustomConverter(new JacksonXmlHttpMessageConverter(xmlMapper)); + builder.withXmlConverter(new JacksonXmlHttpMessageConverter(xmlMapper)); {{/withXml}} }; diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/build.gradle.mustache index be82ad2e14e8..9f11e9263d10 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/build.gradle.mustache @@ -118,7 +118,7 @@ ext { jakarta_annotation_version = "2.1.1" {{/useSpringBoot4}} {{#useSpringBoot4}} - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" {{/useSpringBoot4}} bean_validation_version = "3.1.1" diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/pom.mustache index e111db86344a..794722f79d18 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/restclient/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/restclient/pom.mustache @@ -355,7 +355,7 @@ {{/performBeanValidation}} {{/useSpringBoot4}} {{#useSpringBoot4}} - 7.0.5 + 7.0.8 {{#useJackson3}} 3.1.5 {{/useJackson3}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache index 4e53d0bce40c..9cce8c438a2f 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/build.gradle.mustache @@ -126,7 +126,7 @@ ext { jackson_databind_nullable_version = "0.2.11" {{/openApiNullable}} {{#useSpringBoot4}} - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" {{/useSpringBoot4}} diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache index 462a24143064..78554b348a73 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/pom.mustache @@ -379,7 +379,7 @@ {{/swagger2AnnotationLibrary}} {{#useSpringBoot4}} - 7.0.5 + 7.0.8 {{#useJackson3}} 3.1.5 {{/useJackson3}} 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 3709d0652dbb..1f33e79bcdd2 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 @@ -3702,6 +3702,33 @@ public void testJackson3DefaultMapperFallsBackToDefaultDateFormat_issue_24588() } } + @Test(description = "Regression test for issue #24587: restclient with useJackson3=true must call" + + " builder.registerDefaults().withJsonConverter(...) inside configureMessageConverters so default Spring converters" + + " (ByteArray, String, Resource) are registered with Jackson as the JSON converter.") + public void testRestClientJackson3RegistersDefaults_issue_24587() { + final Path output = newTempFolder(); + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName(JAVA_GENERATOR) + .setLibrary(JavaClientCodegen.RESTCLIENT) + .setAdditionalProperties(Map.of( + CodegenConstants.API_PACKAGE, "xyz.abcdef.api", + JavaClientCodegen.USE_JACKSON_3, true, + JavaClientCodegen.USE_SPRING_BOOT4, true, + JavaClientCodegen.OPENAPI_NULLABLE, false + )) + .setInputSpec("src/test/resources/3_1/java/petstore.yaml") + .setOutputDir(output.toString().replace("\\", "/")); + + List files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate(); + + validateJavaSourceFiles(files); + assertFileContains( + output.resolve("src/main/java/xyz/abcdef/ApiClient.java"), + "Consumer messageConverters = builder -> {", + "builder.registerDefaults().withJsonConverter(new JacksonJsonHttpMessageConverter(mapper));" + ); + } + @Test public void testRestClientWithUseSingleRequestParameter_issue_19406() { diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java index c8d289dc2320..fc467e82460e 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java @@ -8690,4 +8690,32 @@ public void testReactiveSpringHttpInterfaceSupportListOfStringReturnTypeNoRespon "Mono> getUserIdSet" ); } + + @Test + public void testSchemaMappingAddsImport_issue24232() throws IOException { + Map properties = new HashMap<>(); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + properties.put(INTERFACE_ONLY, true); + + File output = Files.createTempDirectory("test").toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator() + .setGeneratorName("spring") + .setAdditionalProperties(properties) + .setSchemaMappings(Map.of("MyKey", "MyCustomKey")) + .setImportMappings(Map.of("MyCustomKey", "org.myorg.MyCustomKey")) + .setInputSpec("src/test/resources/bugs/issue_24232.yaml") + .setOutputDir(output.getAbsolutePath().replace("\\", "/")); + + DefaultGenerator generator = new DefaultGenerator(); + List files = generator.opts(configurator.toClientOptInput()).generate(); + files.forEach(File::deleteOnExit); + + validateJavaSourceFiles(files); + + File testApi = new File(output, "src/main/java/xyz/abcdef/api/SomeApi.java"); + + JavaFileAssert.assertThat(testApi).fileContains("import org.myorg.MyCustomKey;"); + } } \ No newline at end of file diff --git a/modules/openapi-generator/src/test/resources/bugs/issue_24232.yaml b/modules/openapi-generator/src/test/resources/bugs/issue_24232.yaml new file mode 100644 index 000000000000..39304752e1e5 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/bugs/issue_24232.yaml @@ -0,0 +1,42 @@ +openapi: 3.0.0 +info: + version: "1.0.0" + title: mapping +paths: + /some/dummy/endpoint/{id}: + get: + operationId: getDummy + parameters: + - name: id + in: path + required: true + description: My Custom Id + schema: + $ref: '#/components/schemas/MyId' + - name: key + in: query + required: true + description: filter on key + schema: + $ref: '#/components/schemas/MyKey' + responses: + 200: + description: Successfully created reverse listings for retail + content: + application/json: + schema: + $ref: '#/components/schemas/Dummy' +components: + schemas: + Dummy: + type: object + properties: + id: + $ref: '#/components/schemas/MyId' + key: + $ref: '#/components/schemas/MyKey' + MyId: + type: string + format: custom + MyKey: + type: string diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson2/build.gradle b/samples/client/petstore/java/restclient-springBoot4-jackson2/build.gradle index 431e83a45c4c..0ca43c99587e 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson2/build.gradle +++ b/samples/client/petstore/java/restclient-springBoot4-jackson2/build.gradle @@ -100,7 +100,7 @@ ext { jackson_version = "2.21.5" jackson_annotations_version = "2.21" jackson_databind_nullable_version = "0.2.11" - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" jodatime_version = "2.14.0" diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson2/pom.xml b/samples/client/petstore/java/restclient-springBoot4-jackson2/pom.xml index cc170bfc85a4..254f86390061 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson2/pom.xml +++ b/samples/client/petstore/java/restclient-springBoot4-jackson2/pom.xml @@ -263,7 +263,7 @@ UTF-8 - 7.0.5 + 7.0.8 2.21.5 3.0.0 diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/build.gradle b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/build.gradle index 4a13d95a0242..f96dba78d0ba 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/build.gradle +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/build.gradle @@ -99,7 +99,7 @@ if(hasProperty('target') && target == 'android') { ext { jackson_version = "3.1.5" jackson_annotations_version = "2.21" - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" jodatime_version = "2.14.0" diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/pom.xml b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/pom.xml index cc4ad24872e4..3b711f770f7d 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/pom.xml +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/pom.xml @@ -253,7 +253,7 @@ UTF-8 - 7.0.5 + 7.0.8 3.1.5 3.0.0 diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java index 6685f4158cb3..b163e5e98b1c 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3-jspecify/src/main/java/org/openapitools/client/ApiClient.java @@ -158,7 +158,7 @@ protected void init() { public static RestClient.Builder buildRestClientBuilder(JsonMapper mapper) { Consumer messageConverters = builder -> { - builder.addCustomConverter(new JacksonJsonHttpMessageConverter(mapper)); + builder.registerDefaults().withJsonConverter(new JacksonJsonHttpMessageConverter(mapper)); }; return RestClient.builder().configureMessageConverters(messageConverters); diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3/build.gradle b/samples/client/petstore/java/restclient-springBoot4-jackson3/build.gradle index 4a13d95a0242..f96dba78d0ba 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3/build.gradle +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3/build.gradle @@ -99,7 +99,7 @@ if(hasProperty('target') && target == 'android') { ext { jackson_version = "3.1.5" jackson_annotations_version = "2.21" - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" jodatime_version = "2.14.0" diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3/pom.xml b/samples/client/petstore/java/restclient-springBoot4-jackson3/pom.xml index 5c48a8a1078f..dfc643bcecd2 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3/pom.xml +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3/pom.xml @@ -253,7 +253,7 @@ UTF-8 - 7.0.5 + 7.0.8 3.1.5 3.0.0 diff --git a/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java index 76b758db6fa5..1a6045469125 100644 --- a/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/restclient-springBoot4-jackson3/src/main/java/org/openapitools/client/ApiClient.java @@ -160,7 +160,7 @@ protected void init() { public static RestClient.Builder buildRestClientBuilder(JsonMapper mapper) { Consumer messageConverters = builder -> { - builder.addCustomConverter(new JacksonJsonHttpMessageConverter(mapper)); + builder.registerDefaults().withJsonConverter(new JacksonJsonHttpMessageConverter(mapper)); }; return RestClient.builder().configureMessageConverters(messageConverters); diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson2/build.gradle b/samples/client/petstore/java/resttemplate-springBoot4-jackson2/build.gradle index 6a4e5ed9bc06..4bbf932c8e91 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson2/build.gradle +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson2/build.gradle @@ -100,7 +100,7 @@ ext { jackson_version = "2.21.5" jackson_annotations_version = "2.21" jackson_databind_nullable_version = "0.2.11" - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" jodatime_version = "2.9.9" diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson2/pom.xml b/samples/client/petstore/java/resttemplate-springBoot4-jackson2/pom.xml index 2bed49e0d8ec..95216d23cc87 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson2/pom.xml +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson2/pom.xml @@ -279,7 +279,7 @@ UTF-8 - 7.0.5 + 7.0.8 2.21.5 3.0.0 diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/build.gradle b/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/build.gradle index fb07d06311db..b1505f034ff7 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/build.gradle +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/build.gradle @@ -99,7 +99,7 @@ if(hasProperty('target') && target == 'android') { ext { jackson_version = "3.1.5" jackson_annotations_version = "2.21" - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" jodatime_version = "2.9.9" diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/pom.xml b/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/pom.xml index 286993455751..1e1da40de895 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/pom.xml +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson3-jspecify/pom.xml @@ -266,7 +266,7 @@ UTF-8 - 7.0.5 + 7.0.8 3.1.5 3.0.0 diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson3/build.gradle b/samples/client/petstore/java/resttemplate-springBoot4-jackson3/build.gradle index 27fddf9c1601..b3b3bfdbfe85 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson3/build.gradle +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson3/build.gradle @@ -99,7 +99,7 @@ if(hasProperty('target') && target == 'android') { ext { jackson_version = "3.1.5" jackson_annotations_version = "2.21" - spring_web_version = "7.0.5" + spring_web_version = "7.0.8" jakarta_annotation_version = "3.0.0" bean_validation_version = "3.1.1" jodatime_version = "2.9.9" diff --git a/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml b/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml index 859141904ec9..b5c5141bdd3d 100644 --- a/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml +++ b/samples/client/petstore/java/resttemplate-springBoot4-jackson3/pom.xml @@ -269,7 +269,7 @@ UTF-8 - 7.0.5 + 7.0.8 3.1.5 3.0.0