Skip to content

Commit 7ceb189

Browse files
committed
Parameter is now required after upgrading to springdoc-openapi 2.8.10. Fixes #3066
1 parent 633d322 commit 7ceb189

File tree

21 files changed

+726
-135
lines changed

21 files changed

+726
-135
lines changed

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

Lines changed: 46 additions & 13 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

@@ -456,14 +458,16 @@ ObjectMapperProvider springdocObjectMapperProvider(SpringDocConfigProperties spr
456458
/**
457459
* Spring doc customizers spring doc customizers.
458460
*
459-
* @param openApiCustomizers the open api customizers
460-
* @param operationCustomizers the operation customizers
461-
* @param routerOperationCustomizers the router operation customizers
462-
* @param dataRestRouterOperationCustomizers the data rest router operation customizers
463-
* @param methodFilters the method filters
464-
* @param globalOpenApiCustomizers the global open api customizers
465-
* @param globalOperationCustomizers the global operation customizers
466-
* @param globalOpenApiMethodFilters the global open api method filters
461+
* @param openApiCustomizers the open api customizers
462+
* @param operationCustomizers the operation customizers
463+
* @param routerOperationCustomizers the router operation customizers
464+
* @param dataRestRouterOperationCustomizers the data rest router operation customizers
465+
* @param methodFilters the method filters
466+
* @param globalOpenApiCustomizers the global open api customizers
467+
* @param globalOperationCustomizers the global operation customizers
468+
* @param globalOpenApiMethodFilters the global open api method filters
469+
* @param optionalDelegatingMethodParameterCustomizers the optional delegating method parameter customizers
470+
* @param parameterCustomizers the parameter customizers
467471
* @return the spring doc customizers
468472
*/
469473
@Bean
@@ -475,12 +479,15 @@ public SpringDocCustomizers springDocCustomizers(Optional<Set<OpenApiCustomizer>
475479
Optional<Set<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
476480
Optional<Set<OpenApiMethodFilter>> methodFilters, Optional<Set<GlobalOpenApiCustomizer>> globalOpenApiCustomizers,
477481
Optional<Set<GlobalOperationCustomizer>> globalOperationCustomizers,
478-
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters) {
482+
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters,
483+
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers,
484+
Optional<List<ParameterCustomizer>> parameterCustomizers) {
479485
return new SpringDocCustomizers(openApiCustomizers,
480486
operationCustomizers,
481487
routerOperationCustomizers,
482488
dataRestRouterOperationCustomizers,
483-
methodFilters, globalOpenApiCustomizers, globalOperationCustomizers, globalOpenApiMethodFilters);
489+
methodFilters, globalOpenApiCustomizers, globalOperationCustomizers, globalOpenApiMethodFilters,
490+
optionalDelegatingMethodParameterCustomizers, parameterCustomizers);
484491
}
485492

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

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,19 +173,16 @@ DataRestOperationService dataRestOperationBuilder(DataRestRequestService dataRes
173173
* Data rest request builder data rest request builder.
174174
*
175175
* @param localSpringDocParameterNameDiscoverer the local spring doc parameter name discoverer
176-
* @param parameterBuilder the parameter builder
177-
* @param requestBodyService the request body builder
178176
* @param requestBuilder the request builder
179177
* @param springDocDataRestUtils the spring doc data rest utils
180178
* @return the data rest request builder
181179
*/
182180
@Bean
183181
@ConditionalOnMissingBean
184182
@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);
183+
DataRestRequestService dataRestRequestBuilder(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
184+
AbstractRequestService requestBuilder, SpringDocDataRestUtils springDocDataRestUtils) {
185+
return new DataRestRequestService(localSpringDocParameterNameDiscoverer, requestBuilder, springDocDataRestUtils);
189186
}
190187

191188
/**

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
@@ -93,14 +94,8 @@ class SpringDocKotlinConfiguration() {
9394
matchIfMissing = true
9495
)
9596
@Lazy(false)
96-
fun kotlinDefaultsInParamObjects(): DelegatingMethodParameterCustomizer =
97-
DelegatingMethodParameterCustomizer { _, mp ->
98-
val kProp = mp.containingClass.kotlin.primaryConstructor
99-
?.parameters
100-
?.firstOrNull { it.name == mp.parameterName }
101-
if (kProp?.isOptional == true)
102-
(mp as DelegatingMethodParameter).isNotRequired = true
103-
}
97+
fun springDocKotlinUtils(): SpringDocKotlinUtils =
98+
SpringDocKotlinUtils()
10499
}
105100

106101
}

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

Lines changed: 33 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,15 @@ 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;
98107
/**
99108
* Instantiates a new Spring doc customizers.
100109
*
@@ -113,12 +122,14 @@ public SpringDocCustomizers(Optional<Set<OpenApiCustomizer>> openApiCustomizers,
113122
Optional<Set<DataRestRouterOperationCustomizer>> dataRestRouterOperationCustomizers,
114123
Optional<Set<OpenApiMethodFilter>> methodFilters,
115124
Optional<Set<GlobalOpenApiCustomizer>> globalOpenApiCustomizers, Optional<Set<GlobalOperationCustomizer>> globalOperationCustomizers,
116-
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters) {
125+
Optional<Set<GlobalOpenApiMethodFilter>> globalOpenApiMethodFilters, Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers) {
117126
this.openApiCustomizers = openApiCustomizers;
118127
this.operationCustomizers = operationCustomizers;
119128
this.globalOpenApiCustomizers = globalOpenApiCustomizers;
120129
this.globalOperationCustomizers = globalOperationCustomizers;
121130
this.globalOpenApiMethodFilters = globalOpenApiMethodFilters;
131+
this.optionalDelegatingMethodParameterCustomizers = optionalDelegatingMethodParameterCustomizers;
132+
this.parameterCustomizers = parameterCustomizers;
122133
operationCustomizers.ifPresent(customizers -> customizers.removeIf(Objects::isNull));
123134
this.routerOperationCustomizers = routerOperationCustomizers;
124135
this.dataRestRouterOperationCustomizers = dataRestRouterOperationCustomizers;
@@ -134,11 +145,13 @@ public SpringDocCustomizers(Optional<Set<OpenApiCustomizer>> openApiCustomizers,
134145
* @param openApiMethodFilters the open api method filters
135146
*/
136147
public SpringDocCustomizers(Optional<Set<OpenApiCustomizer>> openApiCustomizers, Optional<Set<OperationCustomizer>> operationCustomizers,
137-
Optional<Set<RouterOperationCustomizer>> routerOperationCustomizers, Optional<Set<OpenApiMethodFilter>> openApiMethodFilters) {
148+
Optional<Set<RouterOperationCustomizer>> routerOperationCustomizers, Optional<Set<OpenApiMethodFilter>> openApiMethodFilters, Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, Optional<List<ParameterCustomizer>> parameterCustomizers) {
138149
this.openApiCustomizers = openApiCustomizers;
139150
this.operationCustomizers = operationCustomizers;
140151
this.routerOperationCustomizers = routerOperationCustomizers;
141152
this.methodFilters = openApiMethodFilters;
153+
this.optionalDelegatingMethodParameterCustomizers = optionalDelegatingMethodParameterCustomizers;
154+
this.parameterCustomizers = parameterCustomizers;
142155
this.dataRestRouterOperationCustomizers = Optional.empty();
143156
}
144157

@@ -219,6 +232,24 @@ public Optional<Set<GlobalOpenApiMethodFilter>> getGlobalOpenApiMethodFilters()
219232
return globalOpenApiMethodFilters;
220233
}
221234

235+
/**
236+
* Gets optional delegating method parameter customizers.
237+
*
238+
* @return the optional delegating method parameter customizers
239+
*/
240+
public Optional<List<DelegatingMethodParameterCustomizer>> getOptionalDelegatingMethodParameterCustomizers() {
241+
return optionalDelegatingMethodParameterCustomizers;
242+
}
243+
244+
/**
245+
* Gets parameter customizers.
246+
*
247+
* @return the parameter customizers
248+
*/
249+
public Optional<List<ParameterCustomizer>> getParameterCustomizers() {
250+
return parameterCustomizers;
251+
}
252+
222253
@Override
223254
public void afterPropertiesSet() {
224255
//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;
@@ -97,23 +99,34 @@ public class DataRestRequestService {
9799
* The Spring doc data rest utils.
98100
*/
99101
private final SpringDocDataRestUtils springDocDataRestUtils;
102+
103+
/**
104+
* The Optional delegating method parameter customizers.
105+
*/
106+
private final Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers;
107+
108+
/**
109+
* The Method parameter pojo extractor.
110+
*/
111+
private final MethodParameterPojoExtractor methodParameterPojoExtractor;
100112

101113
/**
102114
* Instantiates a new Data rest request builder.
103115
*
104116
* @param localSpringDocParameterNameDiscoverer the local spring doc parameter name discoverer
105-
* @param parameterBuilder the parameter builder
106-
* @param requestBodyService the request body builder
107117
* @param requestBuilder the request builder
108118
* @param springDocDataRestUtils the spring doc data rest utils
109119
*/
110-
public DataRestRequestService(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer, GenericParameterService parameterBuilder,
111-
RequestBodyService requestBodyService, AbstractRequestService requestBuilder, SpringDocDataRestUtils springDocDataRestUtils) {
120+
public DataRestRequestService(SpringDocParameterNameDiscoverer localSpringDocParameterNameDiscoverer,
121+
AbstractRequestService requestBuilder,
122+
SpringDocDataRestUtils springDocDataRestUtils) {
112123
this.localSpringDocParameterNameDiscoverer = localSpringDocParameterNameDiscoverer;
113-
this.parameterBuilder = parameterBuilder;
114-
this.requestBodyService = requestBodyService;
115124
this.requestBuilder = requestBuilder;
116125
this.springDocDataRestUtils = springDocDataRestUtils;
126+
this.optionalDelegatingMethodParameterCustomizers = requestBuilder.getOptionalDelegatingMethodParameterCustomizers();
127+
this.methodParameterPojoExtractor = requestBuilder.getMethodParameterPojoExtractor();
128+
this.parameterBuilder = requestBuilder.getParameterBuilder();
129+
this.requestBodyService=requestBuilder.getRequestBodyBuilder();
117130
}
118131

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

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,11 @@ 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 defaultFlatParamObject the default flat param object
134+
* @param methodParameterPojoExtractor the method parameter pojo extractor
135135
* @return the method parameter [ ]
136136
*/
137137
public static MethodParameter[] customize(String[] pNames, MethodParameter[] parameters,
138-
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, boolean defaultFlatParamObject) {
138+
Optional<List<DelegatingMethodParameterCustomizer>> optionalDelegatingMethodParameterCustomizers, MethodParameterPojoExtractor methodParameterPojoExtractor, boolean defaultFlatParamObject) {
139139
List<MethodParameter> explodedParameters = new ArrayList<>();
140140
for (int i = 0; i < parameters.length; ++i) {
141141
MethodParameter p = parameters[i];
@@ -147,7 +147,7 @@ public static MethodParameter[] customize(String[] pNames, MethodParameter[] par
147147
if (!MethodParameterPojoExtractor.isSimpleType(paramClass)
148148
&& (hasFlatAnnotation || (defaultFlatParamObject && !hasNotFlatAnnotation && !AbstractRequestService.isRequestTypeToIgnore(paramClass)))) {
149149
List<MethodParameter> flatParams = new CopyOnWriteArrayList<>();
150-
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(flatParams::add);
150+
methodParameterPojoExtractor.extractFrom(paramClass).forEach(flatParams::add);
151151
optionalDelegatingMethodParameterCustomizers.orElseGet(ArrayList::new).forEach(cz -> cz.customizeList(p, flatParams));
152152
explodedParameters.addAll(flatParams);
153153
}

0 commit comments

Comments
 (0)