Skip to content

Commit b292ef4

Browse files
author
bnasslahsen
committed
Improve Pageable support
1 parent f16e5ff commit b292ef4

File tree

14 files changed

+88
-22
lines changed

14 files changed

+88
-22
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/api/annotations/ParameterObject.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@
55
import java.lang.annotation.RetentionPolicy;
66
import java.lang.annotation.Target;
77

8-
@Target(ElementType.PARAMETER)
8+
@Target({ElementType.PARAMETER, ElementType.TYPE})
99
@Retention(RetentionPolicy.RUNTIME)
1010
public @interface ParameterObject {}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535

3636
import org.springframework.core.MethodParameter;
3737
import org.springframework.core.ParameterNameDiscoverer;
38+
import org.springframework.core.annotation.AnnotatedElementUtils;
3839
import org.springframework.lang.NonNull;
3940

4041
/**
@@ -59,8 +60,8 @@ public static MethodParameter[] customize(String[] pNames, MethodParameter[] par
5960
List<MethodParameter> explodedParameters = new ArrayList<>();
6061
for (int i = 0; i < parameters.length; ++i) {
6162
MethodParameter p = parameters[i];
62-
if (p.hasParameterAnnotation(ParameterObject.class)) {
63-
Class<?> paramClass = AdditionalModelsConverter.getReplacement(p.getParameterType());
63+
Class<?> paramClass = AdditionalModelsConverter.getReplacement(p.getParameterType());
64+
if (p.hasParameterAnnotation(ParameterObject.class) || AnnotatedElementUtils.isAnnotated(paramClass, ParameterObject.class)) {
6465
MethodParameterPojoExtractor.extractFrom(paramClass).forEach(explodedParameters::add);
6566
}
6667
else {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ SecurityParser securityParser(PropertyResolverUtils propertyResolverUtils) {
148148
}
149149

150150
@Bean
151-
@ConditionalOnMissingBean
151+
@Lazy(false)
152152
ReturnTypeParser genericReturnTypeParser() {
153153
return new ReturnTypeParser() {};
154154
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,5 +130,11 @@ public SpringDocUtils addSimpleTypePredicateForParameterObject(Predicate<Class<?
130130
MethodParameterPojoExtractor.addSimpleTypePredicate(predicate);
131131
return this;
132132
}
133+
134+
public SpringDocUtils disableReplacement(Class source) {
135+
AdditionalModelsConverter.disableReplacement(source);
136+
return this;
137+
}
138+
133139
}
134140

springdoc-openapi-common/src/main/java/org/springdoc/core/converters/AdditionalModelsConverter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public static Class getReplacement(Class clazz) {
4747
return modelToClassMap.getOrDefault(clazz, clazz);
4848
}
4949

50+
public static void disableReplacement(Class clazz) {
51+
if(modelToClassMap.containsKey(clazz))
52+
modelToClassMap.remove(clazz);
53+
}
54+
5055
@Override
5156
public Schema resolve(AnnotatedType type, ModelConverterContext context, Iterator<ModelConverter> chain) {
5257
JavaType javaType = Json.mapper().constructType(type.getType());

springdoc-openapi-data-rest/src/main/java/org/springdoc/data/rest/converters/Pageable.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@
2222
import java.util.Objects;
2323

2424
import javax.validation.constraints.Min;
25-
import javax.validation.constraints.NotNull;
2625

2726
import io.swagger.v3.oas.annotations.Parameter;
2827
import io.swagger.v3.oas.annotations.media.ArraySchema;
2928
import io.swagger.v3.oas.annotations.media.Schema;
29+
import org.springdoc.api.annotations.ParameterObject;
3030

31-
@NotNull
31+
@ParameterObject
3232
public class Pageable {
3333

3434
@Min(0)

springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/AbstractSpringDocTest.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.slf4j.Logger;
3333
import org.slf4j.LoggerFactory;
3434
import org.springdoc.core.Constants;
35+
import org.springdoc.data.rest.converters.Pageable;
3536

3637
import org.springframework.beans.factory.annotation.Autowired;
3738
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@@ -42,6 +43,7 @@
4243

4344
import static org.hamcrest.Matchers.is;
4445
import static org.skyscreamer.jsonassert.JSONAssert.assertEquals;
46+
import static org.springdoc.core.SpringDocUtils.getConfig;
4547
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
4648
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
4749
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -75,6 +77,7 @@ public static String getContent(String fileName) throws Exception {
7577
public static void afterClass() {
7678
modelConverters.forEach(ModelConverters.getInstance()::removeConverter);
7779
System.clearProperty("spring.hateoas.use-hal-as-default-json-media-type");
80+
getConfig().replaceWithClass(org.springframework.data.domain.Pageable.class, Pageable.class);
7881
}
7982

8083
@Autowired

springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app2/SpringDocApp2Test.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,22 @@
1818

1919
package test.org.springdoc.api.app2;
2020

21+
import javax.annotation.PostConstruct;
22+
2123
import test.org.springdoc.api.AbstractSpringDocTest;
2224

2325
import org.springframework.boot.autoconfigure.SpringBootApplication;
2426

27+
import static org.springdoc.core.SpringDocUtils.getConfig;
28+
2529
public class SpringDocApp2Test extends AbstractSpringDocTest {
2630

2731
@SpringBootApplication
2832
static class SpringDocTestApp {}
2933

34+
@PostConstruct
35+
public void init (){
36+
getConfig().disableReplacement(org.springframework.data.domain.Pageable.class);
37+
}
38+
3039
}

springdoc-openapi-data-rest/src/test/java/test/org/springdoc/api/app7/HelloController.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222

2323
import javax.validation.constraints.NotNull;
2424

25-
import org.springdoc.api.annotations.ParameterObject;
26-
2725
import org.springframework.data.domain.Pageable;
2826
import org.springframework.http.ResponseEntity;
2927
import org.springframework.web.bind.annotation.GetMapping;
@@ -33,7 +31,7 @@
3331
public class HelloController {
3432

3533
@GetMapping(value = "/search", produces = { "application/xml", "application/json" })
36-
public ResponseEntity<List<PersonDTO>> getAllPets(@NotNull @ParameterObject Pageable pageable) {
34+
public ResponseEntity<List<PersonDTO>> getAllPets(@NotNull Pageable pageable) {
3735
return null;
3836
}
3937

springdoc-openapi-data-rest/src/test/resources/results/app2.json

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,21 +58,40 @@
5858
"Pageable": {
5959
"type": "object",
6060
"properties": {
61-
"page": {
62-
"minimum": 0,
61+
"offset": {
62+
"type": "integer",
63+
"format": "int64"
64+
},
65+
"sort": {
66+
"$ref": "#/components/schemas/Sort"
67+
},
68+
"pageSize": {
6369
"type": "integer",
6470
"format": "int32"
6571
},
66-
"size": {
67-
"minimum": 1,
72+
"unpaged": {
73+
"type": "boolean"
74+
},
75+
"paged": {
76+
"type": "boolean"
77+
},
78+
"pageNumber": {
6879
"type": "integer",
6980
"format": "int32"
81+
}
82+
}
83+
},
84+
"Sort": {
85+
"type": "object",
86+
"properties": {
87+
"sorted": {
88+
"type": "boolean"
7089
},
71-
"sort": {
72-
"type": "array",
73-
"items": {
74-
"type": "string"
75-
}
90+
"unsorted": {
91+
"type": "boolean"
92+
},
93+
"empty": {
94+
"type": "boolean"
7695
}
7796
}
7897
},

0 commit comments

Comments
 (0)