diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache index 73cfe2d43a58..2f049f273b95 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache @@ -479,6 +479,14 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { collectionFormat = CollectionFormat.CSV; } + if (value instanceof Map) { + final Map valuesMap = (Map) value; + for (final Entry entry : valuesMap.entrySet()) { + params.add(entry.getKey(), parameterToString(entry.getValue())); + } + return params; + } + Collection valueCollection = null; if (value instanceof Collection) { valueCollection = (Collection) value; diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache index 67d8e3a4fba5..2c49fea70691 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache @@ -457,6 +457,14 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { collectionFormat = CollectionFormat.CSV; } + if (value instanceof Map) { + final Map valuesMap = (Map) value; + for (final Entry entry : valuesMap.entrySet()) { + params.add(entry.getKey(), parameterToString(entry.getValue())); + } + return params; + } + Collection valueCollection = null; if (value instanceof Collection) { valueCollection = (Collection) value; 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 48fa9cadcfbb..f034760ea969 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 @@ -1164,4 +1164,62 @@ public void testWebClientWithUseAbstractionForFiles() throws IOException { "formParams.add(\"file\", file);" ); } + + /** + * See https://github.com/OpenAPITools/openapi-generator/issues/8352 + */ + @Test + public void testRestTemplateWithFreeFormInQueryParameters() throws IOException { + final Map properties = new HashMap<>(); + properties.put(AbstractJavaCodegen.JAVA8_MODE, true); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + + final File output = Files.createTempDirectory("test") + .toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator().setGeneratorName("java") + .setLibrary(JavaClientCodegen.RESTTEMPLATE) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/issue8352.yaml") + .setOutputDir(output.getAbsolutePath() + .replace("\\", "/")); + + final DefaultGenerator generator = new DefaultGenerator(); + final List files = generator.opts(configurator.toClientOptInput()) + .generate(); + files.forEach(File::deleteOnExit); + + final Path defaultApi = Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java"); + TestUtils.assertFileContains(defaultApi, "value instanceof Map"); + } + + /** + * See https://github.com/OpenAPITools/openapi-generator/issues/8352 + */ + @Test + public void testWebClientWithFreeFormInQueryParameters() throws IOException { + final Map properties = new HashMap<>(); + properties.put(AbstractJavaCodegen.JAVA8_MODE, true); + properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"); + + final File output = Files.createTempDirectory("test") + .toFile(); + output.deleteOnExit(); + + final CodegenConfigurator configurator = new CodegenConfigurator().setGeneratorName("java") + .setLibrary(JavaClientCodegen.WEBCLIENT) + .setAdditionalProperties(properties) + .setInputSpec("src/test/resources/3_0/issue8352.yaml") + .setOutputDir(output.getAbsolutePath() + .replace("\\", "/")); + + final DefaultGenerator generator = new DefaultGenerator(); + final List files = generator.opts(configurator.toClientOptInput()) + .generate(); + files.forEach(File::deleteOnExit); + + final Path defaultApi = Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java"); + TestUtils.assertFileContains(defaultApi, "value instanceof Map"); + } } diff --git a/modules/openapi-generator/src/test/resources/3_0/issue8352.yaml b/modules/openapi-generator/src/test/resources/3_0/issue8352.yaml new file mode 100644 index 000000000000..a1298fa8b93c --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/issue8352.yaml @@ -0,0 +1,18 @@ +openapi: 3.0.0 +info: + title: test handle of free form query parameters + version: 0.0.1 +servers: + - url: "http://localhost" +paths: + /some/endpoint: + get: + parameters: + - in: "query" + name: "free-form" + schema: + type: "object" + style: "form" + responses: + 200: + description: "test" \ No newline at end of file diff --git a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java index 1b63359e1e15..0d95c6e8542c 100644 --- a/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate-withXml/src/main/java/org/openapitools/client/ApiClient.java @@ -435,6 +435,14 @@ public MultiValueMap parameterToMultiValueMap(CollectionFormat c collectionFormat = CollectionFormat.CSV; } + if (value instanceof Map) { + final Map valuesMap = (Map) value; + for (final Entry entry : valuesMap.entrySet()) { + params.add(entry.getKey(), parameterToString(entry.getValue())); + } + return params; + } + Collection valueCollection = null; if (value instanceof Collection) { valueCollection = (Collection) value; diff --git a/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java index 9a6e71a8841b..0b49be2164e4 100644 --- a/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java @@ -430,6 +430,14 @@ public MultiValueMap parameterToMultiValueMap(CollectionFormat c collectionFormat = CollectionFormat.CSV; } + if (value instanceof Map) { + final Map valuesMap = (Map) value; + for (final Entry entry : valuesMap.entrySet()) { + params.add(entry.getKey(), parameterToString(entry.getValue())); + } + return params; + } + Collection valueCollection = null; if (value instanceof Collection) { valueCollection = (Collection) value; diff --git a/samples/client/petstore/java/webclient-nulable-arrays/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/webclient-nulable-arrays/src/main/java/org/openapitools/client/ApiClient.java index 087da74084be..ae73f7c6c610 100644 --- a/samples/client/petstore/java/webclient-nulable-arrays/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/webclient-nulable-arrays/src/main/java/org/openapitools/client/ApiClient.java @@ -423,6 +423,14 @@ public MultiValueMap parameterToMultiValueMap(CollectionFormat c collectionFormat = CollectionFormat.CSV; } + if (value instanceof Map) { + final Map valuesMap = (Map) value; + for (final Entry entry : valuesMap.entrySet()) { + params.add(entry.getKey(), parameterToString(entry.getValue())); + } + return params; + } + Collection valueCollection = null; if (value instanceof Collection) { valueCollection = (Collection) value; diff --git a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java index 2320997a57cd..17e3523aa38c 100644 --- a/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/petstore/java/webclient/src/main/java/org/openapitools/client/ApiClient.java @@ -444,6 +444,14 @@ public MultiValueMap parameterToMultiValueMap(CollectionFormat c collectionFormat = CollectionFormat.CSV; } + if (value instanceof Map) { + final Map valuesMap = (Map) value; + for (final Entry entry : valuesMap.entrySet()) { + params.add(entry.getKey(), parameterToString(entry.getValue())); + } + return params; + } + Collection valueCollection = null; if (value instanceof Collection) { valueCollection = (Collection) value;