Skip to content

Commit 0c5a529

Browse files
authored
fix: handle null query parameters in REST client (#23505)
1 parent 0ff9625 commit 0c5a529

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,11 @@ public class {{classname}} {
115115
{{^queryIsJsonMimeType}}
116116
{{#isExplode}}
117117
{{#hasVars}}
118+
if ({{paramName}} != null) {
118119
{{#vars}}
119-
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
120+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
120121
{{/vars}}
122+
}
121123
{{/hasVars}}
122124
{{^hasVars}}
123125
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2642,6 +2642,22 @@ public void testQueryParamsExploded_whenQueryParamIsNull() {
26422642
assertFileContains(output.resolve("src/main/java/xyz/abcdef/api/DepartmentApi.java"), "if (filter != null) {");
26432643
}
26442644

2645+
@Test
2646+
public void testQueryParamsExploded_whenQueryParamIsNull_restclient() {
2647+
final Path output = newTempFolder();
2648+
final CodegenConfigurator configurator = new CodegenConfigurator()
2649+
.setGeneratorName(JAVA_GENERATOR)
2650+
.setLibrary(JavaClientCodegen.RESTCLIENT)
2651+
.setAdditionalProperties(Map.of(CodegenConstants.API_PACKAGE, "xyz.abcdef.api"))
2652+
.setInputSpec("src/test/resources/3_0/issue_17555.yaml")
2653+
.setOutputDir(output.toString().replace("\\", "/"));
2654+
2655+
List<File> files = new DefaultGenerator().opts(configurator.toClientOptInput()).generate();
2656+
2657+
validateJavaSourceFiles(files);
2658+
assertFileContains(output.resolve("src/main/java/xyz/abcdef/api/DepartmentApi.java"), "if (filter != null) {");
2659+
}
2660+
26452661
@Test
26462662
public void generateAllArgsConstructor() {
26472663
Map<String, File> files = generateFromContract("src/test/resources/3_0/java/all_args_constructor.yaml", JavaClientCodegen.RESTTEMPLATE,

samples/client/echo_api/java/restclient/src/main/java/org/openapitools/client/api/QueryApi.java

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -306,12 +306,14 @@ private ResponseSpec testQueryStyleDeepObjectExplodeTrueObjectRequestCreation(@j
306306
final MultiValueMap<String, String> cookieParams = new LinkedMultiValueMap<>();
307307
final MultiValueMap<String, Object> formParams = new LinkedMultiValueMap<>();
308308

309-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "id", queryObject.getId()));
310-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "name", queryObject.getName()));
311-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "category", queryObject.getCategory()));
312-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "photoUrls", queryObject.getPhotoUrls()));
313-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "tags", queryObject.getTags()));
314-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "status", queryObject.getStatus()));
309+
if (queryObject != null) {
310+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "id", queryObject.getId()));
311+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "name", queryObject.getName()));
312+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "category", queryObject.getCategory()));
313+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "photoUrls", queryObject.getPhotoUrls()));
314+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "tags", queryObject.getTags()));
315+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "status", queryObject.getStatus()));
316+
}
315317

316318
final String[] localVarAccepts = {
317319
"text/plain"
@@ -595,7 +597,9 @@ private ResponseSpec testQueryStyleFormExplodeTrueArrayStringRequestCreation(@ja
595597
final MultiValueMap<String, String> cookieParams = new LinkedMultiValueMap<>();
596598
final MultiValueMap<String, Object> formParams = new LinkedMultiValueMap<>();
597599

598-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "values", queryObject.getValues()));
600+
if (queryObject != null) {
601+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "values", queryObject.getValues()));
602+
}
599603

600604
final String[] localVarAccepts = {
601605
"text/plain"
@@ -666,12 +670,14 @@ private ResponseSpec testQueryStyleFormExplodeTrueObjectRequestCreation(@jakarta
666670
final MultiValueMap<String, String> cookieParams = new LinkedMultiValueMap<>();
667671
final MultiValueMap<String, Object> formParams = new LinkedMultiValueMap<>();
668672

669-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "id", queryObject.getId()));
670-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "name", queryObject.getName()));
671-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "category", queryObject.getCategory()));
672-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "photoUrls", queryObject.getPhotoUrls()));
673-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "tags", queryObject.getTags()));
674-
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "status", queryObject.getStatus()));
673+
if (queryObject != null) {
674+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "id", queryObject.getId()));
675+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "name", queryObject.getName()));
676+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "category", queryObject.getCategory()));
677+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "photoUrls", queryObject.getPhotoUrls()));
678+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "tags", queryObject.getTags()));
679+
queryParams.putAll(apiClient.parameterToMultiValueMap(null, "status", queryObject.getStatus()));
680+
}
675681

676682
final String[] localVarAccepts = {
677683
"text/plain"

0 commit comments

Comments
 (0)