Skip to content

Commit eb53b5c

Browse files
committed
Changes report #1845
1 parent 5fb3f7a commit eb53b5c

File tree

6 files changed

+206
-265
lines changed

6 files changed

+206
-265
lines changed

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/configuration/SpringDocHints.java

Lines changed: 13 additions & 263 deletions
Original file line numberDiff line numberDiff line change
@@ -28,294 +28,44 @@
2828
import java.util.Optional;
2929
import java.util.Properties;
3030

31-
import io.swagger.v3.core.converter.ModelConverter;
32-
import io.swagger.v3.core.converter.ModelConverters;
33-
import io.swagger.v3.core.filter.SpecFilter;
34-
import io.swagger.v3.core.jackson.ApiResponsesSerializer;
35-
import io.swagger.v3.core.jackson.PathsSerializer;
36-
import io.swagger.v3.core.jackson.mixin.Components31Mixin;
37-
import io.swagger.v3.core.jackson.mixin.ComponentsMixin;
38-
import io.swagger.v3.core.jackson.mixin.DateSchemaMixin;
39-
import io.swagger.v3.core.jackson.mixin.Discriminator31Mixin;
40-
import io.swagger.v3.core.jackson.mixin.ExampleMixin;
41-
import io.swagger.v3.core.jackson.mixin.ExtensionsMixin;
42-
import io.swagger.v3.core.jackson.mixin.MediaTypeMixin;
43-
import io.swagger.v3.core.jackson.mixin.OpenAPI31Mixin;
44-
import io.swagger.v3.core.jackson.mixin.OpenAPIMixin;
45-
import io.swagger.v3.core.jackson.mixin.OperationMixin;
46-
import io.swagger.v3.core.jackson.mixin.Schema31Mixin;
47-
import io.swagger.v3.core.jackson.mixin.SchemaMixin;
48-
import io.swagger.v3.oas.annotations.ExternalDocumentation;
49-
import io.swagger.v3.oas.annotations.Hidden;
50-
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
51-
import io.swagger.v3.oas.annotations.Operation;
52-
import io.swagger.v3.oas.annotations.Parameter;
53-
import io.swagger.v3.oas.annotations.callbacks.Callbacks;
54-
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
55-
import io.swagger.v3.oas.annotations.extensions.Extension;
56-
import io.swagger.v3.oas.annotations.extensions.ExtensionProperty;
57-
import io.swagger.v3.oas.annotations.headers.Header;
58-
import io.swagger.v3.oas.annotations.info.Contact;
59-
import io.swagger.v3.oas.annotations.info.Info;
60-
import io.swagger.v3.oas.annotations.info.License;
61-
import io.swagger.v3.oas.annotations.links.Link;
62-
import io.swagger.v3.oas.annotations.links.LinkParameter;
63-
import io.swagger.v3.oas.annotations.media.ArraySchema;
64-
import io.swagger.v3.oas.annotations.media.Content;
65-
import io.swagger.v3.oas.annotations.media.DiscriminatorMapping;
66-
import io.swagger.v3.oas.annotations.media.Encoding;
67-
import io.swagger.v3.oas.annotations.media.ExampleObject;
68-
import io.swagger.v3.oas.annotations.media.Schema;
69-
import io.swagger.v3.oas.annotations.parameters.RequestBody;
70-
import io.swagger.v3.oas.annotations.responses.ApiResponse;
71-
import io.swagger.v3.oas.annotations.responses.ApiResponses;
72-
import io.swagger.v3.oas.annotations.security.OAuthFlow;
73-
import io.swagger.v3.oas.annotations.security.OAuthFlows;
74-
import io.swagger.v3.oas.annotations.security.OAuthScope;
75-
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
76-
import io.swagger.v3.oas.annotations.security.SecurityRequirements;
77-
import io.swagger.v3.oas.annotations.security.SecurityScheme;
78-
import io.swagger.v3.oas.annotations.security.SecuritySchemes;
79-
import io.swagger.v3.oas.annotations.servers.Server;
80-
import io.swagger.v3.oas.annotations.servers.ServerVariable;
81-
import io.swagger.v3.oas.annotations.tags.Tag;
82-
import io.swagger.v3.oas.models.Components;
83-
import io.swagger.v3.oas.models.OpenAPI;
84-
import io.swagger.v3.oas.models.PathItem;
85-
import io.swagger.v3.oas.models.Paths;
86-
import io.swagger.v3.oas.models.examples.Example;
87-
import io.swagger.v3.oas.models.media.BinarySchema;
88-
import io.swagger.v3.oas.models.media.BooleanSchema;
89-
import io.swagger.v3.oas.models.media.ByteArraySchema;
90-
import io.swagger.v3.oas.models.media.ComposedSchema;
91-
import io.swagger.v3.oas.models.media.DateSchema;
92-
import io.swagger.v3.oas.models.media.DateTimeSchema;
93-
import io.swagger.v3.oas.models.media.Discriminator;
94-
import io.swagger.v3.oas.models.media.EmailSchema;
95-
import io.swagger.v3.oas.models.media.EncodingProperty;
96-
import io.swagger.v3.oas.models.media.FileSchema;
97-
import io.swagger.v3.oas.models.media.IntegerSchema;
98-
import io.swagger.v3.oas.models.media.MapSchema;
99-
import io.swagger.v3.oas.models.media.MediaType;
100-
import io.swagger.v3.oas.models.media.NumberSchema;
101-
import io.swagger.v3.oas.models.media.ObjectSchema;
102-
import io.swagger.v3.oas.models.media.PasswordSchema;
103-
import io.swagger.v3.oas.models.media.StringSchema;
104-
import io.swagger.v3.oas.models.media.UUIDSchema;
105-
import io.swagger.v3.oas.models.media.XML;
106-
import io.swagger.v3.oas.models.parameters.CookieParameter;
107-
import io.swagger.v3.oas.models.parameters.HeaderParameter;
108-
import io.swagger.v3.oas.models.parameters.PathParameter;
109-
import io.swagger.v3.oas.models.parameters.QueryParameter;
110-
import io.swagger.v3.oas.models.security.Scopes;
111-
import io.swagger.v3.oas.models.servers.ServerVariables;
11231
import org.apache.commons.lang3.StringUtils;
113-
import org.springdoc.api.AbstractOpenApiResource;
114-
import org.springdoc.core.converters.AdditionalModelsConverter;
115-
import org.springdoc.core.converters.FileSupportConverter;
116-
import org.springdoc.core.converters.ModelConverterRegistrar;
117-
import org.springdoc.core.converters.PolymorphicModelConverter;
118-
import org.springdoc.core.converters.PropertyCustomizingConverter;
119-
import org.springdoc.core.converters.ResponseSupportConverter;
120-
import org.springdoc.core.converters.SchemaPropertyDeprecatingConverter;
121-
import org.springdoc.core.mixins.SortedOpenAPIMixin;
122-
import org.springdoc.core.mixins.SortedSchemaMixin;
123-
import org.springdoc.core.models.GroupedOpenApi;
124-
import org.springdoc.core.parsers.ReturnTypeParser;
125-
import org.springdoc.core.properties.SpringDocConfigProperties;
126-
import org.springdoc.core.properties.SwaggerUiConfigParameters;
32+
import org.springdoc.core.configuration.SpringDocHints.SpringDocRuntimeHints;
12733
import org.springdoc.core.properties.SwaggerUiConfigProperties;
128-
import org.springdoc.core.properties.SwaggerUiOAuthProperties;
129-
import org.springdoc.core.providers.WebConversionServiceProvider;
130-
import org.springdoc.core.service.AbstractRequestService;
131-
import org.springdoc.core.service.GenericParameterService;
132-
import org.springdoc.core.service.GenericResponseService;
133-
import org.springdoc.core.service.OpenAPIService;
134-
import org.springdoc.core.service.OperationService;
135-
import org.springdoc.core.service.RequestBodyService;
136-
import org.springdoc.core.service.SecurityService;
137-
import org.springdoc.core.utils.Constants;
138-
import org.springdoc.core.utils.PropertyResolverUtils;
139-
import org.springdoc.ui.AbstractSwaggerWelcome;
14034

35+
import org.springframework.aot.hint.RuntimeHints;
36+
import org.springframework.aot.hint.RuntimeHintsRegistrar;
14137
import org.springframework.beans.factory.InitializingBean;
14238
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
143-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
14439
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
14540
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
14641
import org.springframework.context.annotation.Configuration;
42+
import org.springframework.context.annotation.ImportRuntimeHints;
14743
import org.springframework.context.annotation.Lazy;
148-
import org.springframework.context.annotation.PropertySource;
14944
import org.springframework.core.io.ClassPathResource;
15045
import org.springframework.core.io.Resource;
15146
import org.springframework.core.io.support.PropertiesLoaderUtils;
152-
import org.springframework.nativex.hint.JdkProxyHint;
153-
import org.springframework.nativex.hint.ResourceHint;
154-
import org.springframework.nativex.hint.TypeAccess;
155-
import org.springframework.nativex.hint.TypeHint;
15647
import org.springframework.util.AntPathMatcher;
15748

15849
/**
15950
* The type Spring doc hints.
16051
* @author bnasslahsen
16152
*/
162-
@JdkProxyHint(typeNames = "jakarta.servlet.http.HttpServletRequest")
163-
@JdkProxyHint(typeNames = "org.springframework.web.context.request.NativeWebRequest")
164-
165-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RestController", "org.springframework.core.annotation.SynthesizedAnnotation" })
166-
@JdkProxyHint(typeNames = { "org.springframework.stereotype.Controller", "org.springframework.core.annotation.SynthesizedAnnotation" })
167-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.SessionAttribute", "org.springframework.core.annotation.SynthesizedAnnotation" })
168-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RestControllerAdvice", "org.springframework.core.annotation.SynthesizedAnnotation" })
169-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.ResponseStatus", "org.springframework.core.annotation.SynthesizedAnnotation" })
170-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.ResponseBody", "org.springframework.core.annotation.SynthesizedAnnotation" })
171-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RequestPart", "org.springframework.core.annotation.SynthesizedAnnotation" })
172-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RequestPart", "org.springframework.core.annotation.SynthesizedAnnotation" })
173-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RequestMapping", "org.springframework.core.annotation.SynthesizedAnnotation" })
174-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.GetMapping", "org.springframework.core.annotation.SynthesizedAnnotation" })
175-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.PostMapping", "org.springframework.core.annotation.SynthesizedAnnotation" })
176-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.PutMapping", "org.springframework.core.annotation.SynthesizedAnnotation" })
177-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.PatchMapping", "org.springframework.core.annotation.SynthesizedAnnotation" })
178-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.DeleteMapping", "org.springframework.core.annotation.SynthesizedAnnotation" })
179-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.ControllerAdvice", "org.springframework.core.annotation.SynthesizedAnnotation" })
180-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RequestParam", "org.springframework.core.annotation.SynthesizedAnnotation" })
181-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RequestHeader", "org.springframework.core.annotation.SynthesizedAnnotation" })
182-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.RequestBody", "org.springframework.core.annotation.SynthesizedAnnotation" })
183-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.PathVariable", "org.springframework.core.annotation.SynthesizedAnnotation" })
184-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.ModelAttribute", "org.springframework.core.annotation.SynthesizedAnnotation" })
185-
@JdkProxyHint(typeNames = { "org.springframework.stereotype.Controller", "org.springframework.core.annotation.SynthesizedAnnotation" })
186-
@JdkProxyHint(typeNames = { "org.springframework.web.bind.annotation.ControllerAdvice", "org.springframework.core.annotation.SynthesizedAnnotation" })
187-
188-
@TypeHint(typeNames = { "org.springdoc.core.conditions.CacheOrGroupedOpenApiCondition$OnCacheDisabled", "io.swagger.v3.oas.models.parameters.Parameter$StyleEnum",
189-
"io.swagger.v3.oas.models.security.SecurityScheme$In", "io.swagger.v3.oas.models.security.SecurityScheme$Type",
190-
"org.springdoc.core.conditions.CacheOrGroupedOpenApiCondition$OnMultipleOpenApiSupportCondition", "org.springdoc.core.properties.SpringDocConfigProperties$GroupConfig",
191-
"org.springdoc.core.properties.SpringDocConfigProperties$Cache", "org.springdoc.core.properties.SpringDocConfigProperties$GroupConfig",
192-
"org.springdoc.core.properties.AbstractSwaggerUiConfigProperties$SwaggerUrl", "org.springdoc.core.properties.AbstractSwaggerUiConfigProperties$Direction",
193-
"org.springdoc.core.properties.AbstractSwaggerUiConfigProperties$SyntaxHighlight", "org.springdoc.core.configuration.SpringDocConfiguration$1",
194-
"org.springdoc.core.configuration.SpringDocConfiguration$OpenApiResourceAdvice", "org.springdoc.core.configuration.SpringDocConfiguration$WebConversionServiceConfiguration",
195-
"org.springdoc.core.properties.SpringDocConfigProperties$Webjars", "org.springdoc.core.properties.SpringDocConfigProperties$ApiDocs" },
196-
access = { TypeAccess.RESOURCE, TypeAccess.PUBLIC_CLASSES, TypeAccess.DECLARED_CLASSES, TypeAccess.DECLARED_CONSTRUCTORS, TypeAccess.PUBLIC_CONSTRUCTORS, TypeAccess.DECLARED_METHODS, TypeAccess.PUBLIC_METHODS
197-
, TypeAccess.PUBLIC_FIELDS, TypeAccess.DECLARED_FIELDS })
198-
199-
@TypeHint(types = { Constants.class, ModelConverter.class, ModelConverters.class }, access = { TypeAccess.RESOURCE, TypeAccess.PUBLIC_CLASSES, TypeAccess.DECLARED_CLASSES, TypeAccess.DECLARED_CONSTRUCTORS, TypeAccess.PUBLIC_CONSTRUCTORS, TypeAccess.DECLARED_METHODS, TypeAccess.PUBLIC_METHODS
200-
, TypeAccess.PUBLIC_FIELDS, TypeAccess.DECLARED_FIELDS })
201-
@TypeHint(types = { SecurityRequirements.class, SecurityRequirement.class, ApiResponses.class, Callbacks.class, PropertySource.class, ExternalDocumentation.class, Hidden.class,
202-
Operation.class, Parameter.class, Callbacks.class, Extension.class, ExtensionProperty.class, Header.class, Link.class, LinkParameter.class,
203-
ArraySchema.class, Content.class, DiscriminatorMapping.class, Encoding.class, ExampleObject.class, Schema.class, RequestBody.class, ApiResponse.class,
204-
Info.class, Server.class, ServerVariable.class, OpenAPIDefinition.class, Tag.class, SecuritySchemes.class, SecurityScheme.class, SecuritySchemeType.class,
205-
OAuthFlow.class, OAuthFlows.class, OAuthScope.class, License.class, Contact.class })
206-
207-
@TypeHint(types = {
208-
AbstractSwaggerWelcome.class,
209-
SchemaPropertyDeprecatingConverter.class,
210-
ResponseSupportConverter.class,
211-
PropertyCustomizingConverter.class,
212-
PolymorphicModelConverter.class,
213-
ModelConverterRegistrar.class,
214-
FileSupportConverter.class,
215-
AdditionalModelsConverter.class,
216-
WebConversionServiceProvider.class,
217-
SwaggerUiOAuthProperties.class,
218-
SwaggerUiConfigProperties.class,
219-
SwaggerUiConfigParameters.class,
220-
SpringDocConfigProperties.class,
221-
AbstractOpenApiResource.class,
222-
AbstractRequestService.class,
223-
GenericParameterService.class,
224-
GenericResponseService.class,
225-
GroupedOpenApi.class,
226-
OpenAPIService.class,
227-
OperationService.class,
228-
PropertyResolverUtils.class,
229-
RequestBodyService.class,
230-
ReturnTypeParser.class,
231-
SecurityService.class,
232-
SpringDocConfiguration.class,
233-
SpecFilter.class,
234-
MediaType.class,
235-
ApiResponsesSerializer.class,
236-
PathsSerializer.class,
237-
ComponentsMixin.class,
238-
ExtensionsMixin.class,
239-
OpenAPIMixin.class,
240-
OperationMixin.class,
241-
SchemaMixin.class,
242-
Schema31Mixin.class,
243-
Components31Mixin.class,
244-
OpenAPI31Mixin.class,
245-
Discriminator31Mixin.class,
246-
Paths.class,
247-
XML.class,
248-
UUIDSchema.class,
249-
PathItem.class,
250-
ServerVariables.class,
251-
OpenAPI.class,
252-
Components.class,
253-
StringSchema.class,
254-
DateTimeSchema.class,
255-
Discriminator.class,
256-
BooleanSchema.class,
257-
FileSchema.class,
258-
IntegerSchema.class,
259-
MapSchema.class,
260-
ObjectSchema.class,
261-
Scopes.class,
262-
DateSchema.class,
263-
ComposedSchema.class,
264-
BinarySchema.class,
265-
ByteArraySchema.class,
266-
EmailSchema.class,
267-
Example.class,
268-
EncodingProperty.class,
269-
NumberSchema.class,
270-
PasswordSchema.class,
271-
CookieParameter.class,
272-
HeaderParameter.class,
273-
PathParameter.class,
274-
QueryParameter.class,
275-
DateSchemaMixin.class,
276-
ExampleMixin.class,
277-
MediaTypeMixin.class,
278-
SortedOpenAPIMixin.class,
279-
SortedSchemaMixin.class,
280-
io.swagger.v3.oas.models.security.SecurityScheme.Type.class,
281-
io.swagger.v3.oas.models.security.SecurityScheme.In.class,
282-
io.swagger.v3.oas.models.media.Encoding.class,
283-
io.swagger.v3.oas.models.info.Contact.class,
284-
io.swagger.v3.oas.models.info.License.class,
285-
io.swagger.v3.oas.models.security.OAuthFlow.class, io.swagger.v3.oas.models.security.OAuthFlows.class,
286-
io.swagger.v3.oas.models.security.SecurityScheme.class,
287-
io.swagger.v3.oas.models.tags.Tag.class,
288-
io.swagger.v3.oas.models.servers.ServerVariable.class,
289-
io.swagger.v3.oas.models.servers.Server.class,
290-
io.swagger.v3.oas.models.security.SecurityRequirement.class,
291-
io.swagger.v3.oas.models.info.Info.class,
292-
io.swagger.v3.oas.models.parameters.RequestBody.class,
293-
io.swagger.v3.oas.models.media.Schema.class,
294-
io.swagger.v3.oas.models.media.Content.class,
295-
io.swagger.v3.oas.models.media.ArraySchema.class,
296-
io.swagger.v3.oas.models.responses.ApiResponse.class,
297-
io.swagger.v3.oas.models.responses.ApiResponses.class,
298-
io.swagger.v3.oas.models.ExternalDocumentation.class,
299-
io.swagger.v3.oas.models.links.LinkParameter.class,
300-
io.swagger.v3.oas.models.links.Link.class,
301-
io.swagger.v3.oas.models.parameters.Parameter.class,
302-
io.swagger.v3.oas.models.Operation.class,
303-
io.swagger.v3.oas.models.headers.Header.class,
304-
org.springframework.core.MethodParameter.class
305-
}, access = { TypeAccess.RESOURCE, TypeAccess.PUBLIC_CLASSES, TypeAccess.DECLARED_CLASSES, TypeAccess.DECLARED_CONSTRUCTORS, TypeAccess.PUBLIC_CONSTRUCTORS, TypeAccess.DECLARED_METHODS, TypeAccess.PUBLIC_METHODS
306-
, TypeAccess.PUBLIC_FIELDS, TypeAccess.DECLARED_FIELDS })
307-
308-
@ResourceHint(patterns = "sun.util.resources.LocaleNames", isBundle = true)
309-
31053
@Lazy(false)
31154
@ConditionalOnExpression("${springdoc.api-docs.enabled:true} and ${springdoc.enable-native-support:true}")
312-
@ConditionalOnClass(ResourceHint.class)
31355
@ConditionalOnWebApplication
31456
@Configuration(proxyBeanMethods = false)
315-
@ResourceHint(patterns = SpringDocHints.SPRINGDOC_CONFIG_PROPERTIES)
31657
@ConditionalOnBean(SpringDocConfiguration.class)
58+
@ImportRuntimeHints(SpringDocRuntimeHints.class)
31759
public class SpringDocHints implements InitializingBean {
31860

61+
static class SpringDocRuntimeHints implements RuntimeHintsRegistrar {
62+
@Override
63+
public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
64+
hints.resources().registerPattern(SpringDocHints.SPRINGDOC_CONFIG_PROPERTIES)
65+
.registerResourceBundle("sun.util.resources.LocaleNames");
66+
}
67+
}
68+
31969
/**
32070
* The Swagger ui config properties.
32171
*/

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/service/GenericResponseService.java

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,10 +644,30 @@ else if (returnType instanceof ParameterizedType) {
644644
* @return the generic map response
645645
*/
646646
private synchronized Map<String, ApiResponse> getGenericMapResponse(Class<?> beanType) {
647-
return controllerAdviceInfos.stream()
648-
.filter(controllerAdviceInfo -> new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
647+
List<ControllerAdviceInfo> controllerAdviceInfosInThisBean = controllerAdviceInfos.stream()
648+
.filter(controllerAdviceInfo ->
649+
new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
650+
.filter(controllerAdviceInfo -> beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
651+
.collect(Collectors.toList());
652+
653+
Map<String, ApiResponse> genericApiResponseMap = controllerAdviceInfosInThisBean.stream()
649654
.map(ControllerAdviceInfo::getApiResponseMap)
650655
.collect(LinkedHashMap::new, Map::putAll, Map::putAll);
656+
657+
List<ControllerAdviceInfo> controllerAdviceInfosNotInThisBean = controllerAdviceInfos.stream()
658+
.filter(controllerAdviceInfo ->
659+
new ControllerAdviceBean(controllerAdviceInfo.getControllerAdvice()).isApplicableToBeanType(beanType))
660+
.filter(controllerAdviceInfo -> !beanType.equals(controllerAdviceInfo.getControllerAdvice().getClass()))
661+
.collect(Collectors.toList());
662+
663+
for (ControllerAdviceInfo controllerAdviceInfo : controllerAdviceInfosNotInThisBean) {
664+
controllerAdviceInfo.getApiResponseMap().forEach((key, apiResponse) -> {
665+
if(!genericApiResponseMap.containsKey(key))
666+
genericApiResponseMap.put(key, apiResponse);
667+
});
668+
}
669+
670+
return genericApiResponseMap;
651671
}
652672

653673
/**

0 commit comments

Comments
 (0)