Skip to content

Commit 3190ae2

Browse files
committed
Parameter is now required after upgrading to springdoc-openapi 2.8.10. Fixes #3066
1 parent 74dcd4f commit 3190ae2

File tree

21 files changed

+716
-139
lines changed

21 files changed

+716
-139
lines changed

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

Lines changed: 36 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,15 @@
6868
import org.springdoc.core.customizers.OpenApiCustomizer;
6969
import org.springdoc.core.customizers.OperationCustomizer;
7070
import org.springdoc.core.customizers.OperationIdCustomizer;
71+
import org.springdoc.core.customizers.ParameterCustomizer;
7172
import org.springdoc.core.customizers.ParameterObjectNamingStrategyCustomizer;
7273
import org.springdoc.core.customizers.PropertyCustomizer;
7374
import org.springdoc.core.customizers.QuerydslPredicateOperationCustomizer;
7475
import org.springdoc.core.customizers.RouterOperationCustomizer;
7576
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
7677
import org.springdoc.core.customizers.SpringDocCustomizers;
7778
import org.springdoc.core.discoverer.SpringDocParameterNameDiscoverer;
79+
import org.springdoc.core.extractor.MethodParameterPojoExtractor;
7880
import org.springdoc.core.filters.GlobalOpenApiMethodFilter;
7981
import org.springdoc.core.filters.OpenApiMethodFilter;
8082
import org.springdoc.core.models.GroupedOpenApi;
@@ -97,6 +99,8 @@
9799
import org.springdoc.core.service.RequestBodyService;
98100
import org.springdoc.core.service.SecurityService;
99101
import org.springdoc.core.utils.PropertyResolverUtils;
102+
import org.springdoc.core.utils.SchemaUtils;
103+
import org.springdoc.core.utils.SpringDocKotlinUtils;
100104
import reactor.core.publisher.Flux;
101105

102106
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
@@ -383,7 +387,6 @@ SecurityService securityParser(PropertyResolverUtils propertyResolverUtils) {
383387
* Parameter builder generic parameter builder.
384388
*
385389
* @param propertyResolverUtils the property resolver utils
386-
* @param optionalDelegatingMethodParameterCustomizers the optional list delegating method parameter customizer
387390
* @param optionalWebConversionServiceProvider the optional web conversion service provider
388391
* @param objectMapperProvider the object mapper provider
389392
* @param javadocProvider the javadoc provider
@@ -393,9 +396,8 @@ SecurityService securityParser(PropertyResolverUtils propertyResolverUtils) {
393396
@ConditionalOnMissingBean
394397
@Lazy(false)
395398
GenericParameterService parameterBuilder(PropertyResolverUtils propertyResolverUtils,
396-
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers,
397399
Optional<WebConversionServiceProvider> optionalWebConversionServiceProvider, ObjectMapperProvider objectMapperProvider, Optional<JavadocProvider> javadocProvider) {
398-
return new GenericParameterService(propertyResolverUtils, optionalDelegatingMethodParameterCustomizers,
400+
return new GenericParameterService(propertyResolverUtils,
399401
optionalWebConversionServiceProvider, objectMapperProvider, javadocProvider);
400402
}
401403

@@ -475,12 +477,15 @@ public SpringDocCustomizers springDocCustomizers(Optional<Set<OpenApiCustomizer>
475477
Optional<Set<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
476478
Optional<Set<OpenApiMethodFilter>> methodFilters, Optional<Set<GlobalOpenApiCustomizer>> globalOpenApiCustomizers,
477479
Optional<Set<GlobalOperationCustomizer>> globalOperationCustomizers,
478-
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters) {
480+
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters,
481+
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers,
482+
Optional<List<ParameterCustomizer>> parameterCustomizers) {
479483
return new SpringDocCustomizers(openApiCustomizers,
480484
operationCustomizers,
481485
routerOperationCustomizers,
482486
dataRestRouterOperationCustomizers,
483-
methodFilters, globalOpenApiCustomizers, globalOperationCustomizers, globalOpenApiMethodFilters);
487+
methodFilters, globalOpenApiCustomizers, globalOperationCustomizers, globalOpenApiMethodFilters,
488+
optionalDelegatingMethodParameterCustomizers, parameterCustomizers);
484489
}
485490

486491
/**
@@ -686,4 +691,30 @@ public ResponseEntity<ErrorMessage> handleNoHandlerFound(OpenApiResourceNotFound
686691
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new ErrorMessage(e.getMessage()));
687692
}
688693
}
694+
695+
/**
696+
* Schema utils schema utils.
697+
*
698+
* @param springDocKotlinUtils the spring doc kotlin utils
699+
* @return the schema utils
700+
*/
701+
@Bean
702+
@ConditionalOnMissingBean
703+
@Lazy(false)
704+
SchemaUtils schemaUtils(Optional<SpringDocKotlinUtils> springDocKotlinUtils){
705+
return new SchemaUtils(springDocKotlinUtils);
706+
}
707+
708+
/**
709+
* Method parameter pojo extractor method parameter pojo extractor.
710+
*
711+
* @param schemaUtils the schema utils
712+
* @return the method parameter pojo extractor
713+
*/
714+
@Bean
715+
@ConditionalOnMissingBean
716+
@Lazy(false)
717+
MethodParameterPojoExtractor methodParameterPojoExtractor(SchemaUtils schemaUtils){
718+
return new MethodParameterPojoExtractor(schemaUtils);
719+
}
689720
}

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,9 @@
4242
import org.springdoc.core.providers.ObjectMapperProvider;
4343
import org.springdoc.core.providers.SpringRepositoryRestResourceProvider;
4444
import org.springdoc.core.service.AbstractRequestService;
45-
import org.springdoc.core.service.GenericParameterService;
4645
import org.springdoc.core.service.GenericResponseService;
4746
import org.springdoc.core.service.OpenAPIService;
4847
import org.springdoc.core.service.OperationService;
49-
import org.springdoc.core.service.RequestBodyService;
5048
import org.springdoc.core.utils.SpringDocDataRestUtils;
5149

5250
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -173,19 +171,16 @@ DataRestOperationService dataRestOperationBuilder(DataRestRequestService dataRes
173171
* Data rest request builder data rest request builder.
174172
*
175173
* @param localSpringDocParameterNameDiscoverer the local spring doc parameter name discoverer
176-
* @param parameterBuilder the parameter builder
177-
* @param requestBodyService the request body builder
178174
* @param requestBuilder the request builder
179175
* @param springDocDataRestUtils the spring doc data rest utils
180176
* @return the data rest request builder
181177
*/
182178
@Bean
183179
@ConditionalOnMissingBean
184180
@Lazy(false)
185-
DataRestRequestService dataRestRequestBuilder(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer, GenericParameterService parameterBuilder,
186-
RequestBodyService requestBodyService, AbstractRequestService requestBuilder, SpringDocDataRestUtils springDocDataRestUtils) {
187-
return new DataRestRequestService(localSpringDocParameterNameDiscoverer, parameterBuilder,
188-
requestBodyService, requestBuilder, springDocDataRestUtils);
181+
DataRestRequestService dataRestRequestBuilder(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
182+
AbstractRequestService requestBuilder, SpringDocDataRestUtils springDocDataRestUtils) {
183+
return new DataRestRequestService(localSpringDocParameterNameDiscoverer, requestBuilder, springDocDataRestUtils);
189184
}
190185

191186
/**

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

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import org.springdoc.core.customizers.KotlinDeprecatedPropertyCustomizer
3232
import org.springdoc.core.extractor.DelegatingMethodParameter
3333
import org.springdoc.core.providers.ObjectMapperProvider
3434
import org.springdoc.core.utils.Constants
35+
import org.springdoc.core.utils.SpringDocKotlinUtils
3536
import org.springdoc.core.utils.SpringDocUtils
3637
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean
3738
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
@@ -92,14 +93,8 @@ class SpringDocKotlinConfiguration() {
9293
matchIfMissing = true
9394
)
9495
@Lazy(false)
95-
fun kotlinDefaultsInParamObjects(): DelegatingMethodParameterCustomizer =
96-
DelegatingMethodParameterCustomizer { _, mp ->
97-
val kProp = mp.containingClass.kotlin.primaryConstructor
98-
?.parameters
99-
?.firstOrNull { it.name == mp.parameterName }
100-
if (kProp?.isOptional == true)
101-
(mp as DelegatingMethodParameter).isNotRequired = true
102-
}
96+
fun springDocKotlinUtils(): SpringDocKotlinUtils =
97+
SpringDocKotlinUtils()
10398
}
10499

105100
}

springdoc-openapi-starter-common/src/main/java/org/springdoc/core/customizers/SpringDocCustomizers.java

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
*/
2626
package org.springdoc.core.customizers;
2727

28+
import java.util.List;
2829
import java.util.Map;
2930
import java.util.Objects;
3031
import java.util.Optional;
@@ -94,7 +95,16 @@ public class SpringDocCustomizers implements ApplicationContextAware, Initializi
9495
*/
9596
private Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters;
9697

98+
/**
99+
* The Optional delegating method parameter customizers.
100+
*/
101+
private final Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers;
97102

103+
/**
104+
* The Parameter customizers.
105+
*/
106+
private final Optional<List<ParameterCustomizer>> parameterCustomizers;
107+
98108
/**
99109
* Instantiates a new Spring doc customizers.
100110
*
@@ -113,12 +123,14 @@ public SpringDocCustomizers(Optional<Set<OpenApiCustomizer>> openApiCustomizers,
113123
Optional<Set<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
114124
Optional<Set<OpenApiMethodFilter>> methodFilters,
115125
Optional<Set<GlobalOpenApiCustomizer>> globalOpenApiCustomizers, Optional<Set<GlobalOperationCustomizer>> globalOperationCustomizers,
116-
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters) {
126+
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters, Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers) {
117127
this.openApiCustomizers = openApiCustomizers;
118128
this.operationCustomizers = operationCustomizers;
119129
this.globalOpenApiCustomizers = globalOpenApiCustomizers;
120130
this.globalOperationCustomizers = globalOperationCustomizers;
121131
this.globalOpenApiMethodFilters = globalOpenApiMethodFilters;
132+
this.optionalDelegatingMethodParameterCustomizers = optionalDelegatingMethodParameterCustomizers;
133+
this.parameterCustomizers = parameterCustomizers;
122134
operationCustomizers.ifPresent(customizers -> customizers.removeIf(Objects::isNull));
123135
this.routerOperationCustomizers = routerOperationCustomizers;
124136
this.dataRestRouterOperationCustomizers = dataRestRouterOperationCustomizers;
@@ -134,11 +146,14 @@ public SpringDocCustomizers(Optional<Set<OpenApiCustomizer>> openApiCustomizers,
134146
* @param openApiMethodFilters the open api method filters
135147
*/
136148
public SpringDocCustomizers(Optional<Set<OpenApiCustomizer>> openApiCustomizers, Optional<Set<OperationCustomizer>> operationCustomizers,
137-
Optional<Set<RouterOperationCustomizer>> routerOperationCustomizers, Optional<Set<OpenApiMethodFilter>> openApiMethodFilters) {
149+
Optional<Set<RouterOperationCustomizer>> routerOperationCustomizers, Optional<Set<OpenApiMethodFilter>> openApiMethodFilters,
150+
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers) {
138151
this.openApiCustomizers = openApiCustomizers;
139152
this.operationCustomizers = operationCustomizers;
140153
this.routerOperationCustomizers = routerOperationCustomizers;
141154
this.methodFilters = openApiMethodFilters;
155+
this.optionalDelegatingMethodParameterCustomizers = optionalDelegatingMethodParameterCustomizers;
156+
this.parameterCustomizers = parameterCustomizers;
142157
this.dataRestRouterOperationCustomizers = Optional.empty();
143158
}
144159

@@ -219,6 +234,24 @@ public Optional<Set<GlobalOpenApiMethodFilter>> getGlobalOpenApiMethodFilters()
219234
return globalOpenApiMethodFilters;
220235
}
221236

237+
/**
238+
* Gets optional delegating method parameter customizers.
239+
*
240+
* @return the optional delegating method parameter customizers
241+
*/
242+
public Optional<List<DelegatingMethodParameterCustomizer>> getOptionalDelegatingMethodParameterCustomizers() {
243+
return optionalDelegatingMethodParameterCustomizers;
244+
}
245+
246+
/**
247+
* Gets parameter customizers.
248+
*
249+
* @return the parameter customizers
250+
*/
251+
public Optional<List<ParameterCustomizer>> getParameterCustomizers() {
252+
return parameterCustomizers;
253+
}
254+
222255
@Override
223256
public void afterPropertiesSet() {
224257
//add the default customizers

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

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,10 @@
4343
import io.swagger.v3.oas.models.media.StringSchema;
4444
import io.swagger.v3.oas.models.parameters.Parameter;
4545
import org.apache.commons.lang3.ArrayUtils;
46+
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
4647
import org.springdoc.core.discoverer.SpringDocParameterNameDiscoverer;
4748
import org.springdoc.core.extractor.DelegatingMethodParameter;
49+
import org.springdoc.core.extractor.MethodParameterPojoExtractor;
4850
import org.springdoc.core.models.MethodAttributes;
4951
import org.springdoc.core.models.ParameterInfo;
5052
import org.springdoc.core.models.RequestBodyInfo;
@@ -99,22 +101,33 @@ public class DataRestRequestService {
99101
*/
100102
private final SpringDocDataRestUtils springDocDataRestUtils;
101103

104+
/**
105+
* The Optional delegating method parameter customizers.
106+
*/
107+
private final Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers;
108+
109+
/**
110+
* The Method parameter pojo extractor.
111+
*/
112+
private final MethodParameterPojoExtractor methodParameterPojoExtractor;
113+
102114
/**
103115
* Instantiates a new Data rest request builder.
104116
*
105117
* @param localSpringDocParameterNameDiscoverer the local spring doc parameter name discoverer
106-
* @param parameterBuilder the parameter builder
107-
* @param requestBodyService the request body builder
108118
* @param requestBuilder the request builder
109119
* @param springDocDataRestUtils the spring doc data rest utils
110120
*/
111-
public DataRestRequestService(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer, GenericParameterService parameterBuilder,
112-
RequestBodyService requestBodyService, AbstractRequestService requestBuilder, SpringDocDataRestUtils springDocDataRestUtils) {
121+
public DataRestRequestService(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
122+
AbstractRequestService requestBuilder,
123+
SpringDocDataRestUtils springDocDataRestUtils) {
113124
this.localSpringDocParameterNameDiscoverer = localSpringDocParameterNameDiscoverer;
114-
this.parameterBuilder = parameterBuilder;
115-
this.requestBodyService = requestBodyService;
116125
this.requestBuilder = requestBuilder;
117126
this.springDocDataRestUtils = springDocDataRestUtils;
127+
this.optionalDelegatingMethodParameterCustomizers = requestBuilder.getOptionalDelegatingMethodParameterCustomizers();
128+
this.methodParameterPojoExtractor = requestBuilder.getMethodParameterPojoExtractor();
129+
this.parameterBuilder = requestBuilder.getParameterBuilder();
130+
this.requestBodyService=requestBuilder.getRequestBodyBuilder();
118131
}
119132

120133
/**
@@ -156,7 +169,7 @@ public void buildParameters(OpenAPI openAPI, HandlerMethod handlerMethod, Reques
156169
*/
157170
public void buildCommonParameters(OpenAPI openAPI, RequestMethod requestMethod, MethodAttributes methodAttributes, Operation operation, String[] pNames, MethodParameter[] parameters,
158171
DataRestRepository dataRestRepository) {
159-
parameters = DelegatingMethodParameter.customize(pNames, parameters, parameterBuilder.getOptionalDelegatingMethodParameterCustomizers(), requestBuilder.isDefaultFlatParamObject());
172+
parameters = DelegatingMethodParameter.customize(pNames, parameters, this.optionalDelegatingMethodParameterCustomizers, this.methodParameterPojoExtractor, requestBuilder.isDefaultFlatParamObject());
160173
Class<?> domainType = dataRestRepository.getDomainType();
161174
for (MethodParameter methodParameter : parameters) {
162175
final String pName = methodParameter.getParameterName();

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,12 @@ public class DelegatingMethodParameter extends MethodParameter {
131131
* @param pNames the p names
132132
* @param parameters the parameters
133133
* @param optionalDelegatingMethodParameterCustomizers the optional list delegating method parameter customizer
134+
* @param methodParameterPojoExtractor the method parameter pojo extractor
134135
* @param defaultFlatParamObject the default flat param object
135136
* @return the method parameter [ ]
136137
*/
137138
public static MethodParameter[] customize(String[] pNames, MethodParameter[] parameters,
138-
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, boolean defaultFlatParamObject) {
139+
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, MethodParameterPojoExtractor methodParameterPojoExtractor, boolean defaultFlatParamObject) {
139140
List<MethodParameter> explodedParameters = new ArrayList<>();
140141
for (int i = 0; i < parameters.length; ++i) {
141142
MethodParameter p = parameters[i];
@@ -147,7 +148,7 @@ public static MethodParameter[] customize(String[] pNames, MethodParameter[] par
147148
if (!MethodParameterPojoExtractor.isSimpleType(paramClass)
148149
&& (hasFlatAnnotation || (defaultFlatParamObject && !hasNotFlatAnnotation && !AbstractRequestService.isRequestTypeToIgnore(paramClass)))) {
149150
List<MethodParameter> flatParams = new CopyOnWriteArrayList<>();
150-
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(flatParams::add);
151+
methodParameterPojoExtractor.extractFrom(paramClass).forEach(flatParams::add);
151152
optionalDelegatingMethodParameterCustomizers.orElseGet(ArrayList::new).forEach(cz -> cz.customizeList(p, flatParams));
152153
explodedParameters.addAll(flatParams);
153154
}

0 commit comments

Comments
 (0)