Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 3190ae2

Browse files
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, MethodParameterPojoExtractormethodParameterPojoExtractor, 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)

AltStyle によって変換されたページ (->オリジナル) /