Skip to content

Commit d3c0843

Browse files
committed
Moving PageableDefault support to springdoc-openapi-common. Fixes #1415
1 parent a20e79e commit d3c0843

File tree

12 files changed

+686
-60
lines changed

12 files changed

+686
-60
lines changed

springdoc-openapi-common/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
<!-- For Enhanced Pageable Support -->
5050
<dependency>
5151
<groupId>org.springframework.data</groupId>
52-
<artifactId>spring-data-commons</artifactId>
52+
<artifactId>spring-data-rest-core</artifactId>
5353
<optional>true</optional>
5454
</dependency>
5555
<!-- For Spring Cloud Function Support -->

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

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
*
33
* *
4-
* * * Copyright 2019-2020 the original author or authors.
4+
* * * Copyright 2019-2022 the original author or authors.
55
* * *
66
* * * Licensed under the Apache License, Version 2.0 (the "License");
77
* * * you may not use this file except in compliance with the License.
@@ -18,6 +18,7 @@
1818
*
1919
*/
2020

21+
2122
package org.springdoc.core;
2223

2324
import java.nio.charset.Charset;
@@ -46,6 +47,7 @@
4647
import org.springdoc.core.converters.SchemaPropertyDeprecatingConverter;
4748
import org.springdoc.core.customizers.ActuatorOpenApiCustomizer;
4849
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
50+
import org.springdoc.core.customizers.DataRestDelegatingMethodParameterCustomizer;
4951
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
5052
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
5153
import org.springdoc.core.customizers.OpenApiCustomiser;
@@ -54,9 +56,11 @@
5456
import org.springdoc.core.providers.ActuatorProvider;
5557
import org.springdoc.core.providers.CloudFunctionProvider;
5658
import org.springdoc.core.providers.JavadocProvider;
59+
import org.springdoc.core.providers.RepositoryRestConfigurationProvider;
5760
import org.springdoc.core.providers.RepositoryRestResourceProvider;
5861
import org.springdoc.core.providers.RouterFunctionProvider;
5962
import org.springdoc.core.providers.SecurityOAuth2Provider;
63+
import org.springdoc.core.providers.SpringDataWebPropertiesProvider;
6064
import org.springdoc.core.providers.WebConversionServiceProvider;
6165
import org.springdoc.core.providers.impl.SpringCloudFunctionProvider;
6266

@@ -70,6 +74,7 @@
7074
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
7175
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
7276
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
77+
import org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties;
7378
import org.springframework.boot.autoconfigure.web.format.WebConversionService;
7479
import org.springframework.cloud.function.context.FunctionCatalog;
7580
import org.springframework.cloud.function.web.function.FunctionEndpointInitializer;
@@ -81,6 +86,7 @@
8186
import org.springframework.context.annotation.Lazy;
8287
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
8388
import org.springframework.data.domain.Pageable;
89+
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
8490
import org.springframework.http.HttpStatus;
8591
import org.springframework.http.ResponseEntity;
8692
import org.springframework.util.CollectionUtils;
@@ -488,13 +494,65 @@ PageableOpenAPIConverter pageableOpenAPIConverter() {
488494
.replaceParameterObjectWithClass(org.springframework.data.domain.PageRequest.class, org.springdoc.core.converters.models.Pageable.class);
489495
return new PageableOpenAPIConverter();
490496
}
497+
498+
/**
499+
* Delegating method parameter customizer delegating method parameter customizer.
500+
*
501+
* @param optionalSpringDataWebPropertiesProvider the optional spring data web properties
502+
* @param optionalRepositoryRestConfiguration the optional repository rest configuration
503+
* @return the delegating method parameter customizer
504+
*/
505+
@Bean
506+
@ConditionalOnMissingBean
507+
@Lazy(false)
508+
DelegatingMethodParameterCustomizer delegatingMethodParameterCustomizer(Optional<SpringDataWebPropertiesProvider> optionalSpringDataWebPropertiesProvider, Optional<RepositoryRestConfigurationProvider> optionalRepositoryRestConfiguration) {
509+
return new DataRestDelegatingMethodParameterCustomizer(optionalSpringDataWebPropertiesProvider, optionalRepositoryRestConfiguration);
510+
}
511+
}
512+
513+
/**
514+
* The type Spring doc spring data web properties provider.
515+
*/
516+
@ConditionalOnClass(SpringDataWebProperties.class)
517+
static class SpringDocSpringDataWebPropertiesProvider {
518+
/**
519+
* Spring data web properties provider spring data web properties provider.
520+
*
521+
* @param optionalSpringDataWebProperties the optional spring data web properties
522+
* @return the spring data web properties provider
523+
*/
524+
@Bean
525+
@ConditionalOnMissingBean
526+
@Lazy(false)
527+
SpringDataWebPropertiesProvider springDataWebPropertiesProvider(Optional<SpringDataWebProperties> optionalSpringDataWebProperties) {
528+
return new SpringDataWebPropertiesProvider(optionalSpringDataWebProperties);
529+
}
530+
}
531+
532+
/**
533+
* The type Spring doc repository rest configuration.
534+
*/
535+
@ConditionalOnClass(RepositoryRestConfiguration.class)
536+
static class SpringDocRepositoryRestConfiguration {
537+
/**
538+
* Repository rest configuration provider repository rest configuration provider.
539+
*
540+
* @param optionalRepositoryRestConfiguration the optional repository rest configuration
541+
* @return the repository rest configuration provider
542+
*/
543+
@Bean
544+
@ConditionalOnMissingBean
545+
@Lazy(false)
546+
RepositoryRestConfigurationProvider repositoryRestConfigurationProvider(Optional<RepositoryRestConfiguration> optionalRepositoryRestConfiguration) {
547+
return new RepositoryRestConfigurationProvider(optionalRepositoryRestConfiguration);
548+
}
491549
}
492550

493551
/**
494552
* The type Spring doc function catalog configuration.
495553
*/
496554
@ConditionalOnClass(FunctionEndpointInitializer.class)
497-
@ConditionalOnProperty(name=SPRINGDOC_SHOW_SPRING_CLOUD_FUNCTIONS, matchIfMissing = true)
555+
@ConditionalOnProperty(name = SPRINGDOC_SHOW_SPRING_CLOUD_FUNCTIONS, matchIfMissing = true)
498556
static class SpringDocFunctionCatalogConfiguration {
499557

500558
/**
@@ -509,7 +567,7 @@ static class SpringDocFunctionCatalogConfiguration {
509567
@Bean
510568
@ConditionalOnMissingBean
511569
@Lazy(false)
512-
CloudFunctionProvider springCloudFunctionProvider(Optional<FunctionCatalog> functionCatalog, GenericResponseService genericResponseService, SpringDocConfigProperties springDocConfigProperties, ApplicationContext applicationContext) {
570+
CloudFunctionProvider springCloudFunctionProvider(Optional<FunctionCatalog> functionCatalog, GenericResponseService genericResponseService, SpringDocConfigProperties springDocConfigProperties, ApplicationContext applicationContext) {
513571
return new SpringCloudFunctionProvider(functionCatalog, genericResponseService, springDocConfigProperties, applicationContext);
514572
}
515573
}
Lines changed: 52 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.springdoc.data.rest.customisers;
1+
package org.springdoc.core.customizers;
22

33
import java.lang.annotation.Annotation;
44
import java.lang.reflect.Field;
@@ -24,11 +24,10 @@
2424
import org.slf4j.Logger;
2525
import org.slf4j.LoggerFactory;
2626
import org.springdoc.core.DelegatingMethodParameter;
27-
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
27+
import org.springdoc.core.providers.RepositoryRestConfigurationProvider;
28+
import org.springdoc.core.providers.SpringDataWebPropertiesProvider;
2829

29-
import org.springframework.boot.autoconfigure.data.web.SpringDataWebProperties;
3030
import org.springframework.core.MethodParameter;
31-
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
3231
import org.springframework.data.web.PageableDefault;
3332

3433
/**
@@ -41,39 +40,42 @@ public class DataRestDelegatingMethodParameterCustomizer implements DelegatingMe
4140
*/
4241
private static final Logger LOGGER = LoggerFactory.getLogger(DataRestDelegatingMethodParameterCustomizer.class);
4342

43+
4444
/**
45-
* The Optional spring data web properties.
45+
* The Optional spring data web properties provider.
4646
*/
47-
private final Optional<SpringDataWebProperties> optionalSpringDataWebProperties;
47+
private final Optional<SpringDataWebPropertiesProvider> optionalSpringDataWebPropertiesProvider;
48+
4849

4950
/**
50-
* The Optional repository rest configuration.
51+
* The Optional repository rest configuration provider.
5152
*/
52-
private final Optional<RepositoryRestConfiguration> optionalRepositoryRestConfiguration;
53+
private final Optional<RepositoryRestConfigurationProvider> optionalRepositoryRestConfigurationProvider;
54+
5355

5456
/**
5557
* Instantiates a new Data rest delegating method parameter customizer.
5658
*
57-
* @param optionalSpringDataWebProperties the optional spring data web properties
58-
* @param optionalRepositoryRestConfiguration the optional repository rest configuration
59+
* @param optionalSpringDataWebPropertiesProvider the optional spring data web properties provider
60+
* @param optionalRepositoryRestConfigurationProvider the optional repository rest configuration provider
5961
*/
60-
public DataRestDelegatingMethodParameterCustomizer(Optional<SpringDataWebProperties> optionalSpringDataWebProperties, Optional<RepositoryRestConfiguration> optionalRepositoryRestConfiguration) {
61-
this.optionalSpringDataWebProperties = optionalSpringDataWebProperties;
62-
this.optionalRepositoryRestConfiguration = optionalRepositoryRestConfiguration;
62+
public DataRestDelegatingMethodParameterCustomizer(Optional<SpringDataWebPropertiesProvider> optionalSpringDataWebPropertiesProvider, Optional<RepositoryRestConfigurationProvider> optionalRepositoryRestConfigurationProvider) {
63+
this.optionalSpringDataWebPropertiesProvider = optionalSpringDataWebPropertiesProvider;
64+
this.optionalRepositoryRestConfigurationProvider = optionalRepositoryRestConfigurationProvider;
6365
}
6466

6567
@Override
6668
public void customize(MethodParameter originalParameter, MethodParameter methodParameter) {
6769
PageableDefault pageableDefault = originalParameter.getParameterAnnotation(PageableDefault.class);
68-
if (pageableDefault != null || (org.springframework.data.domain.Pageable.class.isAssignableFrom(originalParameter.getParameterType()) && (optionalSpringDataWebProperties.isPresent() || optionalRepositoryRestConfiguration.isPresent()))) {
70+
if (pageableDefault != null || (org.springframework.data.domain.Pageable.class.isAssignableFrom(originalParameter.getParameterType()) && (isSpringDataWebPropertiesPresent() || isRepositoryRestConfigurationPresent()))) {
6971
Field field = FieldUtils.getDeclaredField(DelegatingMethodParameter.class, "additionalParameterAnnotations", true);
7072
try {
7173
Annotation[] parameterAnnotations = (Annotation[]) field.get(methodParameter);
7274
if (ArrayUtils.isNotEmpty(parameterAnnotations))
7375
for (int i = 0; i < parameterAnnotations.length; i++) {
74-
if (Parameter.class.equals(parameterAnnotations[i].annotationType())){
75-
Optional<Annotation> annotationForField = getNewParameterAnnotationForField(methodParameter, pageableDefault);
76-
if(annotationForField.isPresent())
76+
if (Parameter.class.equals(parameterAnnotations[i].annotationType())) {
77+
Optional<Annotation> annotationForField = getNewParameterAnnotationForField(methodParameter, pageableDefault);
78+
if (annotationForField.isPresent())
7779
parameterAnnotations[i] = annotationForField.get();
7880
}
7981
}
@@ -637,26 +639,26 @@ private String getName(String parameterName, String originalName) {
637639
String name = null;
638640
switch (parameterName) {
639641
case "size":
640-
if (optionalRepositoryRestConfiguration.isPresent())
641-
name = optionalRepositoryRestConfiguration.get().getLimitParamName();
642-
else if (optionalSpringDataWebProperties.isPresent())
643-
name = optionalSpringDataWebProperties.get().getPageable().getSizeParameter();
642+
if (isRepositoryRestConfigurationPresent())
643+
name = optionalRepositoryRestConfigurationProvider.get().getRepositoryRestConfiguration().getLimitParamName();
644+
else if (isSpringDataWebPropertiesPresent())
645+
name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getSizeParameter();
644646
else
645647
name = originalName;
646648
break;
647649
case "sort":
648-
if (optionalRepositoryRestConfiguration.isPresent())
649-
name = optionalRepositoryRestConfiguration.get().getSortParamName();
650-
else if (optionalSpringDataWebProperties.isPresent())
651-
name = optionalSpringDataWebProperties.get().getSort().getSortParameter();
650+
if (isRepositoryRestConfigurationPresent())
651+
name = optionalRepositoryRestConfigurationProvider.get().getRepositoryRestConfiguration().getSortParamName();
652+
else if (isSpringDataWebPropertiesPresent())
653+
name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getSort().getSortParameter();
652654
else
653655
name = originalName;
654656
break;
655657
case "page":
656-
if (optionalRepositoryRestConfiguration.isPresent())
657-
name = optionalRepositoryRestConfiguration.get().getPageParamName();
658-
else if (optionalSpringDataWebProperties.isPresent())
659-
name = optionalSpringDataWebProperties.get().getPageable().getPageParameter();
658+
if (isRepositoryRestConfigurationPresent())
659+
name = optionalRepositoryRestConfigurationProvider.get().getRepositoryRestConfiguration().getPageParamName();
660+
else if (isSpringDataWebPropertiesPresent())
661+
name = optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getPageParameter();
660662
else
661663
name = originalName;
662664
break;
@@ -684,10 +686,10 @@ private String getDefaultValue(String parameterName, PageableDefault pageableDef
684686
case "size":
685687
if (pageableDefault != null)
686688
defaultValue = String.valueOf(pageableDefault.size());
687-
else if (optionalRepositoryRestConfiguration.isPresent())
688-
defaultValue = String.valueOf(optionalRepositoryRestConfiguration.get().getDefaultPageSize());
689-
else if (optionalSpringDataWebProperties.isPresent())
690-
defaultValue = String.valueOf(optionalSpringDataWebProperties.get().getPageable().getDefaultPageSize());
689+
else if (isRepositoryRestConfigurationPresent())
690+
defaultValue = String.valueOf(optionalRepositoryRestConfigurationProvider.get().getRepositoryRestConfiguration().getDefaultPageSize());
691+
else if (isSpringDataWebPropertiesPresent())
692+
defaultValue = String.valueOf(optionalSpringDataWebPropertiesProvider.get().getSpringDataWebProperties().getPageable().getDefaultPageSize());
691693
else
692694
defaultValue = defaultSchemaVal;
693695
break;
@@ -730,4 +732,21 @@ private String getArrayDefaultValue(String parameterName, PageableDefault pageab
730732
return defaultValue;
731733
}
732734

735+
/**
736+
* Spring data web properties is present boolean.
737+
*
738+
* @return the boolean
739+
*/
740+
private boolean isSpringDataWebPropertiesPresent() {
741+
return optionalSpringDataWebPropertiesProvider.isPresent() && optionalSpringDataWebPropertiesProvider.get().isSpringDataWebPropertiesPresent();
742+
}
743+
744+
/**
745+
* Repository rest configuration is present boolean.
746+
*
747+
* @return the boolean
748+
*/
749+
private boolean isRepositoryRestConfigurationPresent() {
750+
return optionalRepositoryRestConfigurationProvider.isPresent() && optionalRepositoryRestConfigurationProvider.get().isRepositoryRestConfigurationPresent();
751+
}
733752
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/*
2+
*
3+
* *
4+
* * * Copyright 2019-2022 the original author or authors.
5+
* * *
6+
* * * Licensed under the Apache License, Version 2.0 (the "License");
7+
* * * you may not use this file except in compliance with the License.
8+
* * * You may obtain a copy of the License at
9+
* * *
10+
* * * https://www.apache.org/licenses/LICENSE-2.0
11+
* * *
12+
* * * Unless required by applicable law or agreed to in writing, software
13+
* * * distributed under the License is distributed on an "AS IS" BASIS,
14+
* * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* * * See the License for the specific language governing permissions and
16+
* * * limitations under the License.
17+
* *
18+
*
19+
*/
20+
package org.springdoc.core.providers;
21+
22+
import java.util.Optional;
23+
24+
import org.springframework.data.rest.core.config.RepositoryRestConfiguration;
25+
26+
/**
27+
* The type Repository rest configuration provider.
28+
* @author bnasslahsen
29+
*/
30+
public class RepositoryRestConfigurationProvider {
31+
32+
33+
/**
34+
* The Optional repository rest configuration.
35+
*/
36+
private final Optional<RepositoryRestConfiguration> optionalRepositoryRestConfiguration;
37+
38+
/**
39+
* Instantiates a new Repository rest configuration provider.
40+
*
41+
* @param optionalRepositoryRestConfiguration the optional repository rest configuration
42+
*/
43+
public RepositoryRestConfigurationProvider(Optional<RepositoryRestConfiguration> optionalRepositoryRestConfiguration) {
44+
this.optionalRepositoryRestConfiguration = optionalRepositoryRestConfiguration;
45+
}
46+
47+
/**
48+
* Gets repository rest configuration.
49+
*
50+
* @return the repository rest configuration
51+
*/
52+
public RepositoryRestConfiguration getRepositoryRestConfiguration() {
53+
return optionalRepositoryRestConfiguration.orElse(null);
54+
}
55+
56+
/**
57+
* Is repository rest configuration present boolean.
58+
*
59+
* @return the boolean
60+
*/
61+
public boolean isRepositoryRestConfigurationPresent() {
62+
return optionalRepositoryRestConfiguration.isPresent();
63+
}
64+
}

0 commit comments

Comments
 (0)