Skip to content

Commit 9eb799d

Browse files
authored
Fix exploded query parameters with array property (#13656)
1 parent b54299f commit 9eb799d

File tree

3 files changed

+111
-42
lines changed

3 files changed

+111
-42
lines changed

modules/openapi-generator/src/main/resources/Java/libraries/native/api.mustache

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,7 +336,12 @@ public class {{classname}} {
336336
{{#isExplode}}
337337
{{#hasVars}}
338338
{{#vars}}
339+
{{#isArray}}
340+
localVarQueryParams.addAll(ApiClient.parameterToPairs("multi", "{{baseName}}", {{paramName}}.{{getter}}()));
341+
{{/isArray}}
342+
{{^isArray}}
339343
localVarQueryParams.addAll(ApiClient.parameterToPairs("{{baseName}}", {{paramName}}.{{getter}}()));
344+
{{/isArray}}
340345
{{/vars}}
341346
{{/hasVars}}
342347
{{^hasVars}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/JavaClientCodegenTest.java

Lines changed: 65 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,41 @@
1717

1818
package org.openapitools.codegen.java;
1919

20-
import static org.openapitools.codegen.TestUtils.validateJavaSourceFiles;
21-
import static org.testng.Assert.assertEquals;
22-
import static org.testng.Assert.assertTrue;
23-
import static org.testng.Assert.fail;
20+
import com.google.common.collect.ImmutableMap;
21+
import io.swagger.v3.oas.models.OpenAPI;
22+
import io.swagger.v3.oas.models.Operation;
23+
import io.swagger.v3.oas.models.media.ArraySchema;
24+
import io.swagger.v3.oas.models.media.ComposedSchema;
25+
import io.swagger.v3.oas.models.media.Content;
26+
import io.swagger.v3.oas.models.media.IntegerSchema;
27+
import io.swagger.v3.oas.models.media.MediaType;
28+
import io.swagger.v3.oas.models.media.ObjectSchema;
29+
import io.swagger.v3.oas.models.media.Schema;
30+
import io.swagger.v3.oas.models.media.StringSchema;
31+
import io.swagger.v3.oas.models.parameters.RequestBody;
32+
import io.swagger.v3.oas.models.responses.ApiResponse;
33+
import io.swagger.v3.parser.util.SchemaTypeUtil;
34+
import org.openapitools.codegen.ClientOptInput;
35+
import org.openapitools.codegen.CodegenConstants;
36+
import org.openapitools.codegen.CodegenModel;
37+
import org.openapitools.codegen.CodegenOperation;
38+
import org.openapitools.codegen.CodegenParameter;
39+
import org.openapitools.codegen.CodegenProperty;
40+
import org.openapitools.codegen.CodegenResponse;
41+
import org.openapitools.codegen.CodegenSecurity;
42+
import org.openapitools.codegen.DefaultGenerator;
43+
import org.openapitools.codegen.TestUtils;
44+
import org.openapitools.codegen.config.CodegenConfigurator;
45+
import org.openapitools.codegen.java.assertions.JavaFileAssert;
46+
import org.openapitools.codegen.languages.AbstractJavaCodegen;
47+
import org.openapitools.codegen.languages.JavaClientCodegen;
48+
import org.openapitools.codegen.languages.features.BeanValidationFeatures;
49+
import org.openapitools.codegen.languages.features.CXFServerFeatures;
50+
import org.openapitools.codegen.model.OperationMap;
51+
import org.openapitools.codegen.model.OperationsMap;
52+
import org.testng.Assert;
53+
import org.testng.annotations.Ignore;
54+
import org.testng.annotations.Test;
2455

2556
import java.io.File;
2657
import java.io.IOException;
@@ -44,42 +75,10 @@
4475
import java.util.regex.Pattern;
4576
import java.util.stream.Collectors;
4677

47-
import org.openapitools.codegen.ClientOptInput;
48-
import org.openapitools.codegen.CodegenConstants;
49-
import org.openapitools.codegen.CodegenModel;
50-
import org.openapitools.codegen.CodegenOperation;
51-
import org.openapitools.codegen.CodegenParameter;
52-
import org.openapitools.codegen.CodegenProperty;
53-
import org.openapitools.codegen.CodegenResponse;
54-
import org.openapitools.codegen.CodegenSecurity;
55-
import org.openapitools.codegen.DefaultGenerator;
56-
import org.openapitools.codegen.TestUtils;
57-
import org.openapitools.codegen.config.CodegenConfigurator;
58-
import org.openapitools.codegen.java.assertions.JavaFileAssert;
59-
import org.openapitools.codegen.languages.AbstractJavaCodegen;
60-
import org.openapitools.codegen.languages.JavaClientCodegen;
61-
import org.openapitools.codegen.languages.features.BeanValidationFeatures;
62-
import org.openapitools.codegen.languages.features.CXFServerFeatures;
63-
import org.openapitools.codegen.model.OperationMap;
64-
import org.openapitools.codegen.model.OperationsMap;
65-
import org.testng.Assert;
66-
import org.testng.annotations.Ignore;
67-
import org.testng.annotations.Test;
68-
69-
import com.google.common.collect.ImmutableMap;
70-
import io.swagger.v3.oas.models.OpenAPI;
71-
import io.swagger.v3.oas.models.Operation;
72-
import io.swagger.v3.oas.models.media.ArraySchema;
73-
import io.swagger.v3.oas.models.media.ComposedSchema;
74-
import io.swagger.v3.oas.models.media.Content;
75-
import io.swagger.v3.oas.models.media.IntegerSchema;
76-
import io.swagger.v3.oas.models.media.MediaType;
77-
import io.swagger.v3.oas.models.media.ObjectSchema;
78-
import io.swagger.v3.oas.models.media.Schema;
79-
import io.swagger.v3.oas.models.media.StringSchema;
80-
import io.swagger.v3.oas.models.parameters.RequestBody;
81-
import io.swagger.v3.oas.models.responses.ApiResponse;
82-
import io.swagger.v3.parser.util.SchemaTypeUtil;
78+
import static org.openapitools.codegen.TestUtils.validateJavaSourceFiles;
79+
import static org.testng.Assert.assertEquals;
80+
import static org.testng.Assert.assertTrue;
81+
import static org.testng.Assert.fail;
8382

8483
public class JavaClientCodegenTest {
8584

@@ -951,7 +950,7 @@ public void testRestTemplateFormMultipart() throws IOException {
951950
*
952951
* UPDATE: the following test has been ignored due to https://github.com/OpenAPITools/openapi-generator/pull/11081/
953952
* We will contact the contributor of the following test to see if the fix will break their use cases and
954-
* how we can fix it accordingly.
953+
* how we can fix it accordingly.
955954
*/
956955
@Test
957956
@Ignore
@@ -1231,7 +1230,7 @@ public void testRestTemplateWithFreeFormInQueryParameters() throws IOException {
12311230
final Path defaultApi = Paths.get(output + "/src/main/java/xyz/abcdef/ApiClient.java");
12321231
TestUtils.assertFileContains(defaultApi, "value instanceof Map");
12331232
}
1234-
1233+
12351234
/**
12361235
* See https://github.com/OpenAPITools/openapi-generator/issues/8352
12371236
*/
@@ -1665,4 +1664,28 @@ public void testReferencedHeader2() throws Exception {
16651664
.assertParameterAnnotations()
16661665
.containsWithName("NotNull");
16671666
}
1667+
1668+
@Test
1669+
public void testNativeClientExplodedQueryParamWithArrayProperty() throws IOException {
1670+
Map<String, Object> properties = new HashMap<>();
1671+
properties.put(CodegenConstants.API_PACKAGE, "xyz.abcdef.api");
1672+
1673+
File output = Files.createTempDirectory("test").toFile();
1674+
output.deleteOnExit();
1675+
1676+
final CodegenConfigurator configurator = new CodegenConfigurator()
1677+
.setGeneratorName("java")
1678+
.setLibrary(JavaClientCodegen.NATIVE)
1679+
.setAdditionalProperties(properties)
1680+
.setInputSpec("src/test/resources/3_0/exploded-query-param-array.yaml")
1681+
.setOutputDir(output.getAbsolutePath().replace("\\", "/"));
1682+
1683+
final ClientOptInput clientOptInput = configurator.toClientOptInput();
1684+
DefaultGenerator generator = new DefaultGenerator();
1685+
generator.opts(clientOptInput).generate();
1686+
1687+
TestUtils.assertFileContains(Paths.get(output + "/src/main/java/xyz/abcdef/api/DefaultApi.java"),
1688+
"localVarQueryParams.addAll(ApiClient.parameterToPairs(\"multi\", \"values\", queryObject.getValues()));"
1689+
);
1690+
}
16681691
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
openapi: 3.0.3
2+
info:
3+
title: Exploded query param array
4+
description: "Exploded query params"
5+
version: "1.0.0"
6+
servers:
7+
- url: localhost:8080
8+
paths:
9+
/api:
10+
get:
11+
operationId: GetSomeValue
12+
parameters:
13+
- in: query
14+
name: QueryObject
15+
explode: true
16+
style: form
17+
schema:
18+
type: object
19+
properties:
20+
values:
21+
type: array
22+
items:
23+
type: string
24+
responses:
25+
'200':
26+
description: Some return value
27+
content:
28+
application/json:
29+
schema:
30+
$ref: '#/components/schemas/SomeReturnValue'
31+
example:
32+
someValue: value
33+
components:
34+
schemas:
35+
SomeReturnValue:
36+
type: object
37+
required:
38+
- someValue
39+
properties:
40+
someValue:
41+
type: string

0 commit comments

Comments
 (0)