Fix issue #907 by ensuring the parameters is properly "exploded" (#14825)

This commit is contained in:
GregDThomas 2023-06-23 13:11:39 +01:00 committed by GitHub
parent b4eb9a40c6
commit 5d6b769b5b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 114 additions and 2 deletions

View File

@ -126,8 +126,10 @@ public class {{classname}} {
final MultiValueMap<String, String> localVarCookieParams = new LinkedMultiValueMap<String, String>(); final MultiValueMap<String, String> localVarCookieParams = new LinkedMultiValueMap<String, String>();
final MultiValueMap<String, Object> localVarFormParams = new LinkedMultiValueMap<String, Object>();{{#hasQueryParams}} final MultiValueMap<String, Object> localVarFormParams = new LinkedMultiValueMap<String, Object>();{{#hasQueryParams}}
{{#queryParams}}localVarQueryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));{{^-last}} {{#queryParams}}{{#isExplode}}{{#hasVars}}{{#vars}} localVarQueryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
{{/-last}}{{/queryParams}}{{/hasQueryParams}}{{#hasHeaderParams}} {{/vars}}{{/hasVars}}{{^hasVars}} localVarQueryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
{{/hasVars}}{{/isExplode}}{{^isExplode}} localVarQueryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
{{/isExplode}}{{/queryParams}}{{/hasQueryParams}}{{#hasHeaderParams}}
{{#headerParams}}if ({{paramName}} != null) {{#headerParams}}if ({{paramName}} != null)
localVarHeaderParams.add("{{baseName}}", apiClient.parameterToString({{paramName}}));{{^-last}} localVarHeaderParams.add("{{baseName}}", apiClient.parameterToString({{paramName}}));{{^-last}}

View File

@ -33,6 +33,7 @@ import io.swagger.v3.oas.models.parameters.RequestBody;
import io.swagger.v3.oas.models.responses.ApiResponse; import io.swagger.v3.oas.models.responses.ApiResponse;
import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.ParseOptions;
import io.swagger.v3.parser.util.SchemaTypeUtil; import io.swagger.v3.parser.util.SchemaTypeUtil;
import lombok.SneakyThrows;
import org.openapitools.codegen.ClientOptInput; import org.openapitools.codegen.ClientOptInput;
import org.openapitools.codegen.CodegenConstants; import org.openapitools.codegen.CodegenConstants;
import org.openapitools.codegen.CodegenModel; import org.openapitools.codegen.CodegenModel;
@ -1968,6 +1969,50 @@ public class JavaClientCodegenTest {
assertFileNotContains(Paths.get(outputPath + "/src/main/java/org/openapitools/client/model/Pet.java"), "@JsonSubTypes.Type(value = Lizard.class, name = \"Lizard\")"); assertFileNotContains(Paths.get(outputPath + "/src/main/java/org/openapitools/client/model/Pet.java"), "@JsonSubTypes.Type(value = Lizard.class, name = \"Lizard\")");
} }
@Test
public void shouldProperlyExplodeRestTemplateQueryParameters_issue907() {
final Map<String, File> files = generateFromContract(
"src/test/resources/3_0/java/explode-query-parameter.yaml",
JavaClientCodegen.RESTTEMPLATE
);
JavaFileAssert.assertThat(files.get("DefaultApi.java"))
.printFileContent()
.assertMethod("searchWithHttpInfo")
.bodyContainsLines("localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, \"regular-param\", regularParam));")
.bodyContainsLines("localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, \"someString\", objectParam.getSomeString()));")
.bodyContainsLines("localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, \"someBoolean\", objectParam.getSomeBoolean()));")
.bodyContainsLines("localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, \"someInteger\", objectParam.getSomeInteger()));")
;
}
private static Map<String, File> generateFromContract(final String pathToSpecification, final String library) {
return generateFromContract(pathToSpecification, library, new HashMap<>());
}
@SneakyThrows
private static Map<String, File> generateFromContract(
final String pathToSpecification,
final String library,
final Map<String, Object> properties
) {
final File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
output.deleteOnExit();
final CodegenConfigurator configurator = new CodegenConfigurator()
.setGeneratorName("java")
.setLibrary(library)
.setAdditionalProperties(properties)
.setInputSpec(pathToSpecification)
.setOutputDir(output.getAbsolutePath());
final ClientOptInput clientOptInput = configurator.toClientOptInput();
final DefaultGenerator generator = new DefaultGenerator();
return generator.opts(clientOptInput).generate().stream()
.collect(Collectors.toMap(File::getName, Function.identity()));
}
@Test @Test
public void testForJavaApacheHttpClientJsonSubtype() throws IOException { public void testForJavaApacheHttpClientJsonSubtype() throws IOException {
File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); File output = Files.createTempDirectory("test").toFile().getCanonicalFile();

View File

@ -0,0 +1,45 @@
openapi: 3.0.3
info:
title: Explode query params
description: "Explode query params"
version: "1.0.0"
servers:
- url: http://localhost:8080
paths:
/api/search:
get:
operationId: Search
parameters:
- name: regular-param
in: query
required: false
schema:
type: string
- name: object-param
in: query
required: true
schema:
type: object
properties:
someString:
type: string
someBoolean:
type: boolean
someInteger:
type: integer
responses:
'200':
description: Some description.
content:
application/json:
schema:
$ref: '#/components/schemas/SomeReturnValue'
components:
schemas:
SomeReturnValue:
type: object
required:
- someValue
properties:
someValue:
type: string

View File

@ -186,6 +186,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };
@ -240,6 +241,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -328,6 +328,7 @@ public class UserApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -186,6 +186,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };
@ -240,6 +241,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -328,6 +328,7 @@ public class UserApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -349,6 +349,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "query", query)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "query", query));
final String[] localVarAccepts = { }; final String[] localVarAccepts = { };
final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
final String[] localVarContentTypes = { final String[] localVarContentTypes = {
@ -575,6 +576,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_integer", enumQueryInteger)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_integer", enumQueryInteger));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_double", enumQueryDouble)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_double", enumQueryDouble));
if (enumHeaderStringArray != null) if (enumHeaderStringArray != null)
localVarHeaderParams.add("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray)); localVarHeaderParams.add("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray));
if (enumHeaderString != null) if (enumHeaderString != null)
@ -655,6 +657,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "string_group", stringGroup)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "string_group", stringGroup));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "int64_group", int64Group)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "int64_group", int64Group));
if (requiredBooleanGroup != null) if (requiredBooleanGroup != null)
localVarHeaderParams.add("required_boolean_group", apiClient.parameterToString(requiredBooleanGroup)); localVarHeaderParams.add("required_boolean_group", apiClient.parameterToString(requiredBooleanGroup));
if (booleanGroup != null) if (booleanGroup != null)
@ -839,6 +842,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "url", url)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "url", url));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("multi".toUpperCase(Locale.ROOT)), "context", context)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("multi".toUpperCase(Locale.ROOT)), "context", context));
final String[] localVarAccepts = { }; final String[] localVarAccepts = { };
final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
final String[] localVarContentTypes = { }; final String[] localVarContentTypes = { };

View File

@ -186,6 +186,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };
@ -240,6 +241,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -322,6 +322,7 @@ public class UserApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -349,6 +349,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "query", query)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "query", query));
final String[] localVarAccepts = { }; final String[] localVarAccepts = { };
final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
final String[] localVarContentTypes = { final String[] localVarContentTypes = {
@ -575,6 +576,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_integer", enumQueryInteger)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_integer", enumQueryInteger));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_double", enumQueryDouble)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "enum_query_double", enumQueryDouble));
if (enumHeaderStringArray != null) if (enumHeaderStringArray != null)
localVarHeaderParams.add("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray)); localVarHeaderParams.add("enum_header_string_array", apiClient.parameterToString(enumHeaderStringArray));
if (enumHeaderString != null) if (enumHeaderString != null)
@ -655,6 +657,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "string_group", stringGroup)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "string_group", stringGroup));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "int64_group", int64Group)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "int64_group", int64Group));
if (requiredBooleanGroup != null) if (requiredBooleanGroup != null)
localVarHeaderParams.add("required_boolean_group", apiClient.parameterToString(requiredBooleanGroup)); localVarHeaderParams.add("required_boolean_group", apiClient.parameterToString(requiredBooleanGroup));
if (booleanGroup != null) if (booleanGroup != null)
@ -839,6 +842,7 @@ public class FakeApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "url", url)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "url", url));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("multi".toUpperCase(Locale.ROOT)), "context", context)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("multi".toUpperCase(Locale.ROOT)), "context", context));
final String[] localVarAccepts = { }; final String[] localVarAccepts = { };
final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts); final List<MediaType> localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
final String[] localVarContentTypes = { }; final String[] localVarContentTypes = { };

View File

@ -186,6 +186,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "status", status));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };
@ -240,6 +241,7 @@ public class PetApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(ApiClient.CollectionFormat.valueOf("csv".toUpperCase(Locale.ROOT)), "tags", tags));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };

View File

@ -322,6 +322,7 @@ public class UserApi {
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "username", username));
localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password)); localVarQueryParams.putAll(apiClient.parameterToMultiValueMap(null, "password", password));
final String[] localVarAccepts = { final String[] localVarAccepts = {
"application/xml", "application/json" "application/xml", "application/json"
}; };