Skip to content

Commit 4d9fd4d

Browse files
Support Json-serialized query parameters in Spring client RestClient and WebClient (#21725)
* Add so that a query parameter can be serialized as Json in the Spring clients RestClient and WebClient * Update samples * Add clientCodeGen test
1 parent 4b88cf8 commit 4d9fd4d

File tree

46 files changed

+740
-178
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+740
-178
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package {{invokerPackage}};
66
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
77
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
88
{{/withXml}}
9+
import com.fasterxml.jackson.core.JsonProcessingException;
910
import com.fasterxml.jackson.databind.DeserializationFeature;
1011
import com.fasterxml.jackson.databind.ObjectMapper;
1112
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@@ -503,6 +504,36 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
503504
}
504505
}
505506

507+
/**
508+
* Converts a parameter to a {@link MultiValueMap} containing Json-serialized values for use in REST requests
509+
* @param collectionFormat The format to convert to
510+
* @param name The name of the parameter
511+
* @param value The parameter's value
512+
* @return a Map containing the Json-serialized String value(s) of the input parameter
513+
*/
514+
public MultiValueMap<String, String> parameterToMultiValueMapJson(CollectionFormat collectionFormat, String name, Object value) {
515+
Collection<?> valueCollection;
516+
if (value instanceof Collection) {
517+
valueCollection = (Collection<?>) value;
518+
} else {
519+
try {
520+
return parameterToMultiValueMap(collectionFormat, name, objectMapper.writeValueAsString(value));
521+
} catch (JsonProcessingException e) {
522+
throw new RuntimeException(e);
523+
}
524+
}
525+
526+
List<String> values = new ArrayList<>();
527+
for(Object o : valueCollection) {
528+
try {
529+
values.add(objectMapper.writeValueAsString(o));
530+
} catch (JsonProcessingException e) {
531+
throw new RuntimeException(e);
532+
}
533+
}
534+
return parameterToMultiValueMap(collectionFormat, name, "[" + StringUtils.collectionToDelimitedString(values, collectionFormat.separator) + "]");
535+
}
536+
506537
/**
507538
* Converts a parameter to a {@link MultiValueMap} for use in REST requests
508539
* @param collectionFormat The format to convert to

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,28 @@ public class {{classname}} {
108108
final MultiValueMap<String, Object> formParams = new LinkedMultiValueMap<>();
109109
{{#hasQueryParams}}
110110

111-
{{#queryParams}}{{#isExplode}}{{#hasVars}}{{#vars}}queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
112-
{{/vars}}{{/hasVars}}{{^hasVars}}queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
113-
{{/hasVars}}{{/isExplode}}{{^isExplode}}queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
114-
{{/isExplode}}{{/queryParams}}{{/hasQueryParams}}{{#hasHeaderParams}}
111+
{{#queryParams}}
112+
{{#queryIsJsonMimeType}}
113+
queryParams.putAll(apiClient.parameterToMultiValueMapJson({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
114+
{{/queryIsJsonMimeType}}
115+
{{^queryIsJsonMimeType}}
116+
{{#isExplode}}
117+
{{#hasVars}}
118+
{{#vars}}
119+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
120+
{{/vars}}
121+
{{/hasVars}}
122+
{{^hasVars}}
123+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
124+
{{/hasVars}}
125+
{{/isExplode}}
126+
{{^isExplode}}
127+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
128+
{{/isExplode}}
129+
{{/queryIsJsonMimeType}}
130+
{{/queryParams}}
131+
{{/hasQueryParams}}
132+
{{#hasHeaderParams}}
115133

116134
{{#headerParams}}
117135
if ({{paramName}} != null)

modules/openapi-generator/src/main/resources/Java/libraries/webclient/ApiClient.mustache

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
package {{invokerPackage}};
44

5+
import com.fasterxml.jackson.core.JsonProcessingException;
56
import com.fasterxml.jackson.databind.DeserializationFeature;
67
import com.fasterxml.jackson.databind.ObjectMapper;
78
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
@@ -446,6 +447,36 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} {
446447
}
447448
}
448449

450+
/**
451+
* Converts a parameter to a {@link MultiValueMap} containing Json-serialized values for use in REST requests
452+
* @param collectionFormat The format to convert to
453+
* @param name The name of the parameter
454+
* @param value The parameter's value
455+
* @return a Map containing the Json-serialized String value(s) of the input parameter
456+
*/
457+
public MultiValueMap<String, String> parameterToMultiValueMapJson(CollectionFormat collectionFormat, String name, Object value) {
458+
Collection<?> valueCollection;
459+
if (value instanceof Collection) {
460+
valueCollection = (Collection<?>) value;
461+
} else {
462+
try {
463+
return parameterToMultiValueMap(collectionFormat, name, objectMapper.writeValueAsString(value));
464+
} catch (JsonProcessingException e) {
465+
throw new RuntimeException(e);
466+
}
467+
}
468+
469+
List<String> values = new ArrayList<>();
470+
for(Object o : valueCollection) {
471+
try {
472+
values.add(objectMapper.writeValueAsString(o));
473+
} catch (JsonProcessingException e) {
474+
throw new RuntimeException(e);
475+
}
476+
}
477+
return parameterToMultiValueMap(collectionFormat, name, "[" + StringUtils.collectionToDelimitedString(values, collectionFormat.separator) + "]");
478+
}
479+
449480
/**
450481
* Converts a parameter to a {@link MultiValueMap} for use in REST requests
451482
* @param collectionFormat The format to convert to

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

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,28 @@ public class {{classname}} {
110110
final MultiValueMap<String, Object> formParams = new LinkedMultiValueMap<String, Object>();
111111
{{#hasQueryParams}}
112112

113-
{{#queryParams}}{{#isExplode}}{{#hasVars}}{{#vars}}queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
114-
{{/vars}}{{/hasVars}}{{^hasVars}}queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
115-
{{/hasVars}}{{/isExplode}}{{^isExplode}}queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
116-
{{/isExplode}}{{/queryParams}}{{/hasQueryParams}}{{#hasHeaderParams}}
113+
{{#queryParams}}
114+
{{#queryIsJsonMimeType}}
115+
queryParams.putAll(apiClient.parameterToMultiValueMapJson({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
116+
{{/queryIsJsonMimeType}}
117+
{{^queryIsJsonMimeType}}
118+
{{#isExplode}}
119+
{{#hasVars}}
120+
{{#vars}}
121+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}.{{getter}}()));
122+
{{/vars}}
123+
{{/hasVars}}
124+
{{^hasVars}}
125+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
126+
{{/hasVars}}
127+
{{/isExplode}}
128+
{{^isExplode}}
129+
queryParams.putAll(apiClient.parameterToMultiValueMap({{#collectionFormat}}ApiClient.CollectionFormat.valueOf("{{{.}}}".toUpperCase(Locale.ROOT)){{/collectionFormat}}{{^collectionFormat}}null{{/collectionFormat}}, "{{baseName}}", {{paramName}}));
130+
{{/isExplode}}
131+
{{/queryIsJsonMimeType}}
132+
{{/queryParams}}
133+
{{/hasQueryParams}}
134+
{{#hasHeaderParams}}
117135

118136
{{#headerParams}}
119137
if ({{paramName}} != null)

0 commit comments

Comments
 (0)