Skip to content

Commit eb1475e

Browse files
author
springdoc
committed
Preserve order of @parameters not working for spring-boot 2.2. fixes #289
1 parent 837b594 commit eb1475e

File tree

5 files changed

+154
-4
lines changed

5 files changed

+154
-4
lines changed

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

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,16 +345,24 @@ private Map<String, io.swagger.v3.oas.annotations.Parameter> getApiParameters(Me
345345

346346
Set<io.swagger.v3.oas.annotations.Parameters> apiParametersDocDeclaringClass = AnnotatedElementUtils
347347
.findAllMergedAnnotations(declaringClass, io.swagger.v3.oas.annotations.Parameters.class);
348-
apiParametersMap.putAll(apiParametersDocDeclaringClass.stream()
349-
.flatMap(x -> Stream.of(x.value())).collect(Collectors.toMap(io.swagger.v3.oas.annotations.Parameter::name, x -> x)));
348+
LinkedHashMap<String, io.swagger.v3.oas.annotations.Parameter> apiParametersDocDeclaringClassMap = apiParametersDocDeclaringClass.stream()
349+
.flatMap(x -> Stream.of(x.value())).collect(Collectors.toMap(io.swagger.v3.oas.annotations.Parameter::name, x -> x, (e1, e2) -> e2,
350+
LinkedHashMap::new));
351+
apiParametersMap.putAll(apiParametersDocDeclaringClassMap);
350352

351353
Set<io.swagger.v3.oas.annotations.Parameter> apiParameterDoc = AnnotatedElementUtils
352354
.findAllMergedAnnotations(method, io.swagger.v3.oas.annotations.Parameter.class);
353-
apiParametersMap.putAll(apiParameterDoc.stream().collect(Collectors.toMap(io.swagger.v3.oas.annotations.Parameter::name, x -> x)));
355+
LinkedHashMap<String, io.swagger.v3.oas.annotations.Parameter> apiParameterDocMap = apiParameterDoc.stream()
356+
.collect(Collectors.toMap(io.swagger.v3.oas.annotations.Parameter::name, x -> x, (e1, e2) -> e2,
357+
LinkedHashMap::new));
358+
apiParametersMap.putAll(apiParameterDocMap);
354359

355360
Set<io.swagger.v3.oas.annotations.Parameter> apiParameterDocDeclaringClass = AnnotatedElementUtils
356361
.findAllMergedAnnotations(declaringClass, io.swagger.v3.oas.annotations.Parameter.class);
357-
apiParametersMap.putAll(apiParameterDocDeclaringClass.stream().collect(Collectors.toMap(io.swagger.v3.oas.annotations.Parameter::name, x -> x)));
362+
LinkedHashMap<String, io.swagger.v3.oas.annotations.Parameter> apiParameterDocDeclaringClassMap = apiParameterDocDeclaringClass.stream()
363+
.collect(Collectors.toMap(io.swagger.v3.oas.annotations.Parameter::name, x -> x, (e1, e2) -> e2,
364+
LinkedHashMap::new));
365+
apiParametersMap.putAll(apiParameterDocDeclaringClassMap);
358366

359367
return apiParametersMap;
360368
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package test.org.springdoc.api.app3;
2+
3+
import io.swagger.v3.oas.annotations.Operation;
4+
import io.swagger.v3.oas.annotations.Parameter;
5+
import io.swagger.v3.oas.annotations.Parameters;
6+
import io.swagger.v3.oas.annotations.enums.ParameterIn;
7+
import io.swagger.v3.oas.annotations.media.ArraySchema;
8+
import io.swagger.v3.oas.annotations.media.Content;
9+
import io.swagger.v3.oas.annotations.media.Schema;
10+
import org.springframework.http.MediaType;
11+
import org.springframework.web.bind.annotation.GetMapping;
12+
import org.springframework.web.bind.annotation.RequestMapping;
13+
import org.springframework.web.bind.annotation.RestController;
14+
15+
import java.lang.annotation.ElementType;
16+
import java.lang.annotation.Retention;
17+
import java.lang.annotation.RetentionPolicy;
18+
import java.lang.annotation.Target;
19+
20+
@RestController
21+
@RequestMapping(path = "/demo",
22+
produces = MediaType.TEXT_PLAIN_VALUE)
23+
public class HelloController {
24+
25+
@GetMapping("operation4")
26+
@PageableAsQueryParam
27+
public String operation4() {
28+
return "operation4";
29+
}
30+
31+
32+
@Parameters({
33+
@Parameter(in = ParameterIn.QUERY
34+
, description = "Page you want to retrieve (0..N)"
35+
, name = "page"
36+
, content = @Content(schema = @Schema(type = "integer", defaultValue = "0"))),
37+
@Parameter(in = ParameterIn.QUERY
38+
, description = "Number of records per page."
39+
, name = "size"
40+
, content = @Content(schema = @Schema(type = "integer", defaultValue = "20"))),
41+
@Parameter(in = ParameterIn.QUERY
42+
, description = "Sorting criteria in the format: property(,asc|desc). "
43+
+ "Default sort order is ascending. " + "Multiple sort criteria are supported."
44+
, name = "sort"
45+
, content = @Content(array = @ArraySchema(schema = @Schema(type = "string"))))
46+
})
47+
@Retention(RetentionPolicy.RUNTIME)
48+
@Target({ElementType.METHOD})
49+
public @interface PageableAsQueryParam {}
50+
51+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package test.org.springdoc.api.app3;
2+
3+
import test.org.springdoc.api.AbstractSpringDocTest;
4+
5+
public class SpringDocApp3Test extends AbstractSpringDocTest {
6+
7+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package test.org.springdoc.api.app3;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class SpringDocTestApp {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(SpringDocTestApp.class, args);
11+
}
12+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{
2+
"openapi": "3.0.1",
3+
"info": {
4+
"title": "OpenAPI definition",
5+
"version": "v0"
6+
},
7+
"servers": [
8+
{
9+
"url": "http://localhost",
10+
"description": "Generated server url"
11+
}
12+
],
13+
"paths": {
14+
"/demo/operation4": {
15+
"get": {
16+
"tags": [
17+
"hello-controller"
18+
],
19+
"operationId": "operation4",
20+
"parameters": [
21+
{
22+
"name": "page",
23+
"in": "query",
24+
"description": "Page you want to retrieve (0..N)",
25+
"schema": {
26+
"type": "integer",
27+
"default": "0"
28+
}
29+
},
30+
{
31+
"name": "size",
32+
"in": "query",
33+
"description": "Number of records per page.",
34+
"schema": {
35+
"type": "integer",
36+
"default": "20"
37+
}
38+
},
39+
{
40+
"name": "sort",
41+
"in": "query",
42+
"description": "Sorting criteria in the format: property(,asc|desc). Default sort order is ascending. Multiple sort criteria are supported.",
43+
"schema": {
44+
"type": "array",
45+
"items": {
46+
"type": "string"
47+
}
48+
}
49+
}
50+
],
51+
"responses": {
52+
"200": {
53+
"description": "default response",
54+
"content": {
55+
"*/*": {
56+
"schema": {
57+
"type": "string"
58+
}
59+
},
60+
"text/plain": {
61+
"schema": {
62+
"type": "string"
63+
}
64+
}
65+
}
66+
}
67+
}
68+
}
69+
}
70+
},
71+
"components": {}
72+
}

0 commit comments

Comments
 (0)