Skip to content

Commit f5d44a8

Browse files
committed
code review
1 parent 3ef246d commit f5d44a8

File tree

11 files changed

+95
-100
lines changed

11 files changed

+95
-100
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/AbstractRequestService.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,11 @@ public abstract class AbstractRequestService {
166166
*/
167167
private final Optional<List<ParameterCustomizer>> parameterCustomizers;
168168

169+
/**
170+
* The Default flat param object.
171+
*/
172+
private final boolean defaultFlatParamObject;
173+
169174
/**
170175
* Instantiates a new Abstract request builder.
171176
*
@@ -185,7 +190,7 @@ protected AbstractRequestService(GenericParameterService parameterBuilder, Reque
185190
parameterCustomizers.ifPresent(customizers -> customizers.removeIf(Objects::isNull));
186191
this.parameterCustomizers = parameterCustomizers;
187192
this.localSpringDocParameterNameDiscoverer = localSpringDocParameterNameDiscoverer;
188-
parameterBuilder.addIgnoreType(PARAM_TYPES_TO_IGNORE);
193+
this.defaultFlatParamObject = parameterBuilder.getPropertyResolverUtils().getSpringDocConfigProperties().isDefaultFlatParamObject();
189194
}
190195

191196
/**
@@ -240,7 +245,7 @@ public Operation build(HandlerMethod handlerMethod, RequestMethod requestMethod,
240245
String[] reflectionParametersNames = Arrays.stream(handlerMethod.getMethod().getParameters()).map(java.lang.reflect.Parameter::getName).toArray(String[]::new);
241246
if (pNames == null || Arrays.stream(pNames).anyMatch(Objects::isNull))
242247
pNames = reflectionParametersNames;
243-
parameters = parameterBuilder.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer());
248+
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer(), this.defaultFlatParamObject);
244249
RequestBodyInfo requestBodyInfo = new RequestBodyInfo();
245250
List<Parameter> operationParameters = (operation.getParameters() != null) ? operation.getParameters() : new ArrayList<>();
246251
Map<String, io.swagger.v3.oas.annotations.Parameter> parametersDocMap = getApiParameters(handlerMethod.getMethod());
@@ -323,7 +328,7 @@ else if (!RequestMethod.GET.equals(requestMethod)) {
323328
Entry<String, Parameter> entry = it.next();
324329
Parameter parameter = entry.getValue();
325330
if (!ParameterIn.PATH.toString().equals(parameter.getIn())) {
326-
io.swagger.v3.oas.models.media.Schema<?> itemSchema = new io.swagger.v3.oas.models.media.Schema();
331+
io.swagger.v3.oas.models.media.Schema<?> itemSchema = new io.swagger.v3.oas.models.media.Schema() ;
327332
itemSchema.setName(entry.getKey());
328333
itemSchema.setDescription(parameter.getDescription());
329334
itemSchema.setDeprecated(parameter.getDeprecated());
@@ -741,4 +746,12 @@ private String getParamJavadoc(JavadocProvider javadocProvider, MethodParameter
741746
return paramJavadocDescription;
742747
}
743748

749+
/**
750+
* Is default flat param object boolean.
751+
*
752+
* @return the boolean
753+
*/
754+
public boolean isDefaultFlatParamObject() {
755+
return defaultFlatParamObject;
756+
}
744757
}

springdoc-openapi-common/src/main/java/org/springdoc/core/DelegatingMethodParameter.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,23 @@
2929
import java.lang.reflect.Member;
3030
import java.lang.reflect.Method;
3131
import java.lang.reflect.Type;
32+
import java.util.ArrayList;
3233
import java.util.Arrays;
34+
import java.util.List;
3335
import java.util.Objects;
36+
import java.util.Optional;
3437

3538
import org.apache.commons.lang3.ArrayUtils;
3639
import org.apache.commons.lang3.reflect.FieldUtils;
3740
import org.slf4j.Logger;
3841
import org.slf4j.LoggerFactory;
42+
import org.springdoc.api.annotations.ParameterObject;
43+
import org.springdoc.core.converters.AdditionalModelsConverter;
44+
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
3945

4046
import org.springframework.core.MethodParameter;
4147
import org.springframework.core.ParameterNameDiscoverer;
48+
import org.springframework.core.annotation.AnnotatedElementUtils;
4249
import org.springframework.lang.NonNull;
4350
import org.springframework.lang.Nullable;
4451

@@ -96,6 +103,50 @@ public class DelegatingMethodParameter extends MethodParameter {
96103
this.isNotRequired = isNotRequired;
97104
}
98105

106+
/**
107+
* Customize method parameter [ ].
108+
*
109+
* @param pNames the p names
110+
* @param parameters the parameters
111+
* @param optionalDelegatingMethodParameterCustomizer the optional delegating method parameter customizer
112+
* @return the method parameter [ ]
113+
*/
114+
public static MethodParameter[] customize(String[] pNames, MethodParameter[] parameters,
115+
Optional<DelegatingMethodParameterCustomizer> optionalDelegatingMethodParameterCustomizer, boolean defaultFlatParamObject) {
116+
List<MethodParameter> explodedParameters = new ArrayList<>();
117+
for (int i = 0; i < parameters.length; ++i) {
118+
MethodParameter p = parameters[i];
119+
Class<?> paramClass = AdditionalModelsConverter.getParameterObjectReplacement(p.getParameterType());
120+
121+
if (!MethodParameterPojoExtractor.isSimpleType(paramClass) && (p.hasParameterAnnotation(ParameterObject.class) || AnnotatedElementUtils.isAnnotated(paramClass, ParameterObject.class))) {
122+
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(methodParameter -> {
123+
optionalDelegatingMethodParameterCustomizer.ifPresent(customizer -> customizer.customize(p, methodParameter));
124+
explodedParameters.add(methodParameter);
125+
});
126+
}
127+
else if (defaultFlatParamObject) {
128+
boolean isSimpleType = MethodParameterPojoExtractor.isSimpleType(paramClass);
129+
boolean hasAnnotation = p.hasParameterAnnotations();
130+
boolean shouldFlat = !isSimpleType && !hasAnnotation;
131+
if (shouldFlat && !AbstractRequestService.isRequestTypeToIgnore(paramClass)) {
132+
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(methodParameter -> {
133+
optionalDelegatingMethodParameterCustomizer
134+
.ifPresent(customizer -> customizer.customize(p, methodParameter));
135+
explodedParameters.add(methodParameter);
136+
});
137+
}
138+
else {
139+
String name = pNames != null ? pNames[i] : p.getParameterName();
140+
explodedParameters.add(new DelegatingMethodParameter(p, name, null, false, false));
141+
}
142+
}
143+
else {
144+
String name = pNames != null ? pNames[i] : p.getParameterName();
145+
explodedParameters.add(new DelegatingMethodParameter(p, name, null, false, false));
146+
}
147+
}
148+
return explodedParameters.toArray(new MethodParameter[0]);
149+
}
99150

100151
@Override
101152
@NonNull

springdoc-openapi-common/src/main/java/org/springdoc/core/GenericParameterService.java

Lines changed: 3 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,6 @@
5555
import org.apache.commons.lang3.StringUtils;
5656
import org.slf4j.Logger;
5757
import org.slf4j.LoggerFactory;
58-
import org.springdoc.api.annotations.ParameterObject;
59-
import org.springdoc.core.converters.AdditionalModelsConverter;
6058
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
6159
import org.springdoc.core.providers.ObjectMapperProvider;
6260
import org.springdoc.core.providers.WebConversionServiceProvider;
@@ -66,7 +64,6 @@
6664
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
6765
import org.springframework.core.MethodParameter;
6866
import org.springframework.core.ResolvableType;
69-
import org.springframework.core.annotation.AnnotatedElementUtils;
7067
import org.springframework.core.io.Resource;
7168
import org.springframework.web.context.request.RequestScope;
7269
import org.springframework.web.multipart.MultipartFile;
@@ -125,13 +122,6 @@ public class GenericParameterService {
125122
*/
126123
private final ObjectMapperProvider objectMapperProvider;
127124

128-
/**
129-
* The constant PARAM_TYPES_TO_IGNORE.
130-
*/
131-
private final List<Class<?>> PARAM_TYPES_TO_IGNORE = Collections.synchronizedList(new ArrayList<>());
132-
133-
private final boolean defaultFlatParamObject;
134-
135125
/**
136126
* Instantiates a new Generic parameter builder.
137127
* @param propertyResolverUtils the property resolver utils
@@ -140,18 +130,13 @@ public class GenericParameterService {
140130
* @param objectMapperProvider the object mapper provider
141131
*/
142132
public GenericParameterService(PropertyResolverUtils propertyResolverUtils, Optional<DelegatingMethodParameterCustomizer> optionalDelegatingMethodParameterCustomizer,
143-
Optional<WebConversionServiceProvider> optionalWebConversionServiceProvider, ObjectMapperProvider objectMapperProvider, boolean defaultFlatParamObject) {
133+
Optional<WebConversionServiceProvider> optionalWebConversionServiceProvider, ObjectMapperProvider objectMapperProvider) {
144134
this.propertyResolverUtils = propertyResolverUtils;
145135
this.optionalDelegatingMethodParameterCustomizer = optionalDelegatingMethodParameterCustomizer;
146136
this.optionalWebConversionServiceProvider = optionalWebConversionServiceProvider;
147137
this.configurableBeanFactory = propertyResolverUtils.getFactory();
148138
this.expressionContext = (configurableBeanFactory != null ? new BeanExpressionContext(configurableBeanFactory, new RequestScope()) : null);
149139
this.objectMapperProvider = objectMapperProvider;
150-
this.defaultFlatParamObject = defaultFlatParamObject;
151-
}
152-
153-
protected void addIgnoreType(List<Class<?>> classes) {
154-
PARAM_TYPES_TO_IGNORE.addAll(classes);
155140
}
156141

157142
/**
@@ -348,9 +333,9 @@ Schema calculateSchema(Components components, ParameterInfo parameterInfo, Reque
348333

349334
if (parameterInfo.getParameterModel() == null || parameterInfo.getParameterModel().getSchema() == null) {
350335
Type type = ReturnTypeParser.getType(methodParameter);
351-
if (type instanceof Class && optionalWebConversionServiceProvider.isPresent()) {
336+
if(type instanceof Class && optionalWebConversionServiceProvider.isPresent()){
352337
WebConversionServiceProvider webConversionServiceProvider = optionalWebConversionServiceProvider.get();
353-
if (!MethodParameterPojoExtractor.isSwaggerPrimitiveType((Class) type) && methodParameter.getParameterType().getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class) == null)
338+
if (!MethodParameterPojoExtractor.isSwaggerPrimitiveType((Class) type) && methodParameter.getParameterType().getAnnotation(io.swagger.v3.oas.annotations.media.Schema.class)==null)
354339
type = webConversionServiceProvider.getSpringConvertedType(methodParameter.getParameterType());
355340
}
356341
schemaN = SpringDocAnnotationsUtils.extractSchema(components, type, jsonView, methodParameter.getParameterAnnotations());
@@ -581,7 +566,6 @@ public io.swagger.v3.oas.annotations.Parameter generateParameterBySchema(io.swag
581566
public Class<? extends Annotation> annotationType() {
582567
return io.swagger.v3.oas.annotations.Parameter.class;
583568
}
584-
585569
@Override
586570
public String name() {
587571
return schema.name();
@@ -668,47 +652,4 @@ public String ref() {
668652
}
669653
};
670654
}
671-
672-
/**
673-
* Customize method parameter [ ].
674-
*
675-
* @param pNames the p names
676-
* @param parameters the parameters
677-
* @param optionalDelegatingMethodParameterCustomizer the optional delegating method parameter customizer
678-
* @return the method parameter [ ]
679-
*/
680-
public MethodParameter[] customize(String[] pNames, MethodParameter[] parameters, Optional<DelegatingMethodParameterCustomizer> optionalDelegatingMethodParameterCustomizer) {
681-
List<MethodParameter> explodedParameters = new ArrayList<>();
682-
for (int i = 0; i < parameters.length; ++i) {
683-
MethodParameter p = parameters[i];
684-
Class<?> paramClass = AdditionalModelsConverter.getParameterObjectReplacement(p.getParameterType());
685-
if (!MethodParameterPojoExtractor.isSimpleType(paramClass) && (p.hasParameterAnnotation(ParameterObject.class) || AnnotatedElementUtils.isAnnotated(paramClass, ParameterObject.class))) {
686-
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(methodParameter -> {
687-
optionalDelegatingMethodParameterCustomizer.ifPresent(customizer -> customizer.customize(p, methodParameter));
688-
explodedParameters.add(methodParameter);
689-
});
690-
}
691-
else if (defaultFlatParamObject) {
692-
boolean isSimpleType = MethodParameterPojoExtractor.isSimpleType(paramClass);
693-
boolean hasAnnotation = p.hasParameterAnnotations();
694-
boolean shouldFlat = !isSimpleType && !hasAnnotation;
695-
if (shouldFlat && PARAM_TYPES_TO_IGNORE.stream().noneMatch(ignore -> ignore.isAssignableFrom(paramClass))) {
696-
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(methodParameter -> {
697-
optionalDelegatingMethodParameterCustomizer
698-
.ifPresent(customizer -> customizer.customize(p, methodParameter));
699-
explodedParameters.add(methodParameter);
700-
});
701-
}
702-
else {
703-
String name = pNames != null ? pNames[i] : p.getParameterName();
704-
explodedParameters.add(new DelegatingMethodParameter(p, name, null, false, false));
705-
}
706-
}
707-
else {
708-
String name = pNames != null ? pNames[i] : p.getParameterName();
709-
explodedParameters.add(new DelegatingMethodParameter(p, name, null, false, false));
710-
}
711-
}
712-
return explodedParameters.toArray(new MethodParameter[0]);
713-
}
714655
}

springdoc-openapi-common/src/main/java/org/springdoc/core/MethodParameterPojoExtractor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ private static Class<?> extractType(Class<?> paramClass, Field field) {
156156

157157
if (fieldType instanceof Class<?>)
158158
type = (Class<?>) fieldType;
159-
else // This is the case for not reifiable types
159+
else // This is the case for not reifiable types
160160
type = null;
161161
}
162162

@@ -175,7 +175,7 @@ private static Stream<MethodParameter> fromSimpleClass(Class<?> paramClass, Fiel
175175
Annotation[] fieldAnnotations = field.getDeclaredAnnotations();
176176
try {
177177
Parameter parameter = field.getAnnotation(Parameter.class);
178-
boolean isNotRequired = parameter == null || !parameter.required();
178+
boolean isNotRequired = parameter == null || !parameter.required();
179179
Annotation[] finalFieldAnnotations = fieldAnnotations;
180180
return Stream.of(Introspector.getBeanInfo(paramClass).getPropertyDescriptors())
181181
.filter(d -> d.getName().equals(field.getName()))

springdoc-openapi-common/src/main/java/org/springdoc/core/PropertyResolverUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,4 +207,13 @@ private void resolveProperty(Supplier<String> getProperty, Consumer<String> setP
207207
public ConfigurableBeanFactory getFactory() {
208208
return factory;
209209
}
210+
211+
/**
212+
* Gets spring doc config properties.
213+
*
214+
* @return the spring doc config properties
215+
*/
216+
public SpringDocConfigProperties getSpringDocConfigProperties() {
217+
return springDocConfigProperties;
218+
}
210219
}

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfigProperties.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,11 @@ public boolean isDefaultFlatParamObject() {
235235
return defaultFlatParamObject;
236236
}
237237

238+
/**
239+
* Sets default flat param object.
240+
*
241+
* @param defaultFlatParamObject the default flat param object
242+
*/
238243
public void setDefaultFlatParamObject(boolean defaultFlatParamObject) {
239244
this.defaultFlatParamObject = defaultFlatParamObject;
240245
}

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ PolymorphicModelConverter polymorphicModelConverter(ObjectMapperProvider objectM
240240
@Lazy(false)
241241
OpenAPIService openAPIBuilder(Optional<OpenAPI> openAPI,
242242
SecurityService securityParser,
243-
SpringDocConfigProperties springDocConfigProperties, PropertyResolverUtils propertyResolverUtils,
243+
SpringDocConfigProperties springDocConfigProperties,PropertyResolverUtils propertyResolverUtils,
244244
Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers,
245245
Optional<List<ServerBaseUrlCustomizer>> serverBaseUrlCustomisers, Optional<JavadocProvider> javadocProvider) {
246246
return new OpenAPIService(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers, serverBaseUrlCustomisers, javadocProvider);
@@ -335,18 +335,16 @@ ReturnTypeParser genericReturnTypeParser() {
335335
* @param optionalDelegatingMethodParameterCustomizer the optional delegating method parameter customizer
336336
* @param optionalWebConversionServiceProvider the optional web conversion service provider
337337
* @param objectMapperProvider the object mapper provider
338-
* @param springDocConfigProperties the springdoc config properties
339338
* @return the generic parameter builder
340339
*/
341340
@Bean
342341
@ConditionalOnMissingBean
343342
@Lazy(false)
344343
GenericParameterService parameterBuilder(PropertyResolverUtils propertyResolverUtils,
345344
Optional<DelegatingMethodParameterCustomizer> optionalDelegatingMethodParameterCustomizer,
346-
Optional<WebConversionServiceProvider> optionalWebConversionServiceProvider, ObjectMapperProvider objectMapperProvider,
347-
SpringDocConfigProperties springDocConfigProperties) {
345+
Optional<WebConversionServiceProvider> optionalWebConversionServiceProvider, ObjectMapperProvider objectMapperProvider) {
348346
return new GenericParameterService(propertyResolverUtils, optionalDelegatingMethodParameterCustomizer,
349-
optionalWebConversionServiceProvider, objectMapperProvider, springDocConfigProperties.isDefaultFlatParamObject());
347+
optionalWebConversionServiceProvider, objectMapperProvider);
350348
}
351349

352350
/**
@@ -413,7 +411,7 @@ static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor2() {
413411
@Lazy(false)
414412
SpringDocProviders springDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
415413
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider,
416-
Optional<SpringWebProvider> springWebProvider, Optional<WebConversionServiceProvider> webConversionServiceProvider,
414+
Optional<SpringWebProvider> springWebProvider, Optional<WebConversionServiceProvider> webConversionServiceProvider,
417415
ObjectMapperProvider objectMapperProvider) {
418416
return new SpringDocProviders(actuatorProvider, springCloudFunctionProvider, springSecurityOAuth2Provider, repositoryRestResourceProvider, routerFunctionProvider, springWebProvider, webConversionServiceProvider, objectMapperProvider);
419417
}
@@ -613,7 +611,7 @@ CloudFunctionProvider springCloudFunctionProvider(Optional<FunctionCatalog> func
613611
@Bean
614612
@ConditionalOnMissingBean
615613
@Lazy(false)
616-
ObjectMapperProvider springDocObjectMapperProvider(SpringDocConfigProperties springDocConfigProperties) {
614+
ObjectMapperProvider springDocObjectMapperProvider(SpringDocConfigProperties springDocConfigProperties){
617615
return new ObjectMapperProvider(springDocConfigProperties);
618616
}
619617

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/core/DataRestRequestService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import io.swagger.v3.oas.models.parameters.Parameter;
4141
import org.apache.commons.lang3.ArrayUtils;
4242
import org.springdoc.core.AbstractRequestService;
43+
import org.springdoc.core.DelegatingMethodParameter;
4344
import org.springdoc.core.GenericParameterService;
4445
import org.springdoc.core.MethodAttributes;
4546
import org.springdoc.core.ParameterInfo;
@@ -148,7 +149,7 @@ public void buildParameters(OpenAPI openAPI, HandlerMethod handlerMethod, Reques
148149
*/
149150
public void buildCommonParameters(OpenAPI openAPI, RequestMethod requestMethod, MethodAttributes methodAttributes, Operation operation, String[] pNames, MethodParameter[] parameters,
150151
DataRestRepository dataRestRepository) {
151-
parameters = parameterBuilder.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer());
152+
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getDelegatingMethodParameterCustomizer(), requestBuilder.isDefaultFlatParamObject());
152153
Class<?> domainType = dataRestRepository.getDomainType();
153154
for (MethodParameter methodParameter : parameters) {
154155
final String pName = methodParameter.getParameterName();

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app71/Dog.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,4 @@ public class Dog {
3737
)
3838
String displayName;
3939

40-
public String getDisplayName() {
41-
return displayName;
42-
}
43-
44-
public void setDisplayName(String displayName) {
45-
this.displayName = displayName;
46-
}
47-
}
40+
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/v30/app93/BaseClientModel.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,4 @@
2727
public abstract class BaseClientModel {
2828
@JsonProperty("id")
2929
int id;
30-
31-
public int getId() {
32-
return id;
33-
}
34-
35-
public void setId(int id) {
36-
this.id = id;
37-
}
3830
}

0 commit comments

Comments
 (0)