Skip to content

Commit ee8c964

Browse files
author
bnasslahsen
committed
Improve support of Webflux with Functional Endpoints
1 parent 679c73b commit ee8c964

File tree

8 files changed

+258
-151
lines changed

8 files changed

+258
-151
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/api/AbstractOpenApiResource.java

+179-136
Large diffs are not rendered by default.

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.math.BigDecimal;
2626
import java.util.ArrayList;
2727
import java.util.Arrays;
28+
import java.util.Collection;
2829
import java.util.HashMap;
2930
import java.util.LinkedHashMap;
3031
import java.util.List;
@@ -230,6 +231,11 @@ private LinkedHashMap<String, Parameter> getParameterLinkedHashMap(Components co
230231
}
231232
}
232233

234+
getHeaders(methodAttributes, map);
235+
return map;
236+
}
237+
238+
public static Collection<Parameter> getHeaders(MethodAttributes methodAttributes, LinkedHashMap<String, Parameter> map) {
233239
for (Map.Entry<String, String> entry : methodAttributes.getHeaders().entrySet()) {
234240
Parameter parameter = new Parameter().in(ParameterIn.HEADER.toString()).name(entry.getKey()).schema(new StringSchema().addEnumItem(entry.getValue()));
235241
if (map.containsKey(entry.getKey())) {
@@ -239,7 +245,7 @@ private LinkedHashMap<String, Parameter> getParameterLinkedHashMap(Components co
239245
}
240246
map.put(entry.getKey(), parameter);
241247
}
242-
return map;
248+
return map.values();
243249
}
244250

245251
protected Parameter customiseParameter(Parameter parameter, ParameterInfo parameterInfo) {

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public static boolean isFile(Class type) {
9393
return FILE_TYPES.stream().anyMatch(clazz -> clazz.isAssignableFrom(type));
9494
}
9595

96-
Parameter mergeParameter(List<Parameter> existingParamDoc, Parameter paramCalcul) {
96+
public static Parameter mergeParameter(List<Parameter> existingParamDoc, Parameter paramCalcul) {
9797
Parameter result = paramCalcul;
9898
if (paramCalcul != null && paramCalcul.getName() != null) {
9999
final String name = paramCalcul.getName();
@@ -108,7 +108,7 @@ Parameter mergeParameter(List<Parameter> existingParamDoc, Parameter paramCalcul
108108
return result;
109109
}
110110

111-
private void mergeParameter(Parameter paramCalcul, Parameter paramDoc) {
111+
private static void mergeParameter(Parameter paramCalcul, Parameter paramDoc) {
112112
if (StringUtils.isBlank(paramDoc.getDescription()))
113113
paramDoc.setDescription(paramCalcul.getDescription());
114114

springdoc-openapi-common/src/main/java/org/springdoc/core/models/RouterFunctionData.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
package org.springdoc.core.models;
2222

2323
import java.util.ArrayList;
24+
import java.util.HashMap;
2425
import java.util.List;
26+
import java.util.Map;
2527
import java.util.Set;
2628

2729
import org.apache.commons.lang3.ArrayUtils;
@@ -41,7 +43,7 @@ public class RouterFunctionData {
4143

4244
private List<String> headers = new ArrayList<>();
4345

44-
private String queryParam;
46+
private Map<String, String> queryParams = new HashMap<>();
4547

4648
private RequestMethod[] methods;
4749

@@ -53,12 +55,12 @@ public void setPath(String path) {
5355
this.path = path;
5456
}
5557

56-
public String getQueryParam() {
57-
return queryParam;
58+
public Map<String, String> getQueryParams() {
59+
return queryParams;
5860
}
5961

60-
public void setQueryParam(String queryParam) {
61-
this.queryParam = queryParam;
62+
public void addQueryParams(String name, String value) {
63+
this.queryParams.put(name, value);
6264
}
6365

6466
public String[] getHeaders() {
@@ -89,7 +91,7 @@ public void addConsumes(String consumes) {
8991

9092
public void addProduces(String produces) {
9193
if (StringUtils.isNotBlank(produces))
92-
this.produces.add(produces);
94+
this.produces.add(produces);
9395
}
9496

9597
private RequestMethod[] getMethod(Set<HttpMethod> methods) {

springdoc-openapi-common/src/main/java/org/springdoc/core/models/RouterOperation.java

+17
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
package org.springdoc.core.models;
2222

23+
import java.util.Map;
24+
2325
import io.swagger.v3.oas.annotations.Operation;
2426
import org.apache.commons.lang3.ArrayUtils;
2527
import org.apache.commons.lang3.StringUtils;
@@ -45,6 +47,8 @@ public class RouterOperation {
4547

4648
private Class<?>[] parameterTypes;
4749

50+
private Map<String, String> queryParams;
51+
4852
private Operation operation;
4953

5054
public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOperationAnnotation) {
@@ -69,7 +73,12 @@ public RouterOperation(org.springdoc.core.annotations.RouterOperation routerOper
6973
this.parameterTypes = routerOperationAnnotation.parameterTypes();
7074
this.operation = routerOperationAnnotation.operation();
7175
this.headers = ArrayUtils.isEmpty(routerOperationAnnotation.headers()) ? routerFunctionData.getHeaders() : routerOperationAnnotation.headers();
76+
this.queryParams = routerFunctionData.getQueryParams();
77+
}
7278

79+
public RouterOperation(String path, RequestMethod[] methods) {
80+
this.path = path;
81+
this.methods = methods;
7382
}
7483

7584
public String getPath() {
@@ -143,4 +152,12 @@ public String[] getHeaders() {
143152
public void setHeaders(String[] headers) {
144153
this.headers = headers;
145154
}
155+
156+
public Map<String, String> getQueryParams() {
157+
return queryParams;
158+
}
159+
160+
public void setQueryParams(Map<String, String> queryParams) {
161+
this.queryParams = queryParams;
162+
}
146163
}

springdoc-openapi-common/src/main/java/org/springdoc/core/visitor/AbstractRouterFunctionVisitor.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public List<RouterFunctionData> getRouterFunctionDatas() {
5757
}
5858

5959
public void queryParam(String name, String value) {
60-
// Not yet needed
60+
routerFunctionData.addQueryParams(name, value);
6161
}
6262

6363
public void pathExtension(String extension) {
@@ -100,7 +100,4 @@ public void endNegate() {
100100
// Not yet needed
101101
}
102102

103-
104-
105-
106103
}

springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app75/PostRouter.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@
4040
import static org.springframework.web.reactive.function.server.RequestPredicates.GET;
4141
import static org.springframework.web.reactive.function.server.RequestPredicates.POST;
4242
import static org.springframework.web.reactive.function.server.RequestPredicates.PUT;
43+
import static org.springframework.web.reactive.function.server.RequestPredicates.queryParam;
4344
import static org.springframework.web.reactive.function.server.RouterFunctions.route;
4445

4546
@Configuration
4647
class PostRouter {
4748

48-
@RouterOperations({ @RouterOperation(path = "/posts", method = RequestMethod.GET, operation = @Operation(operationId = "all",
49+
@RouterOperations({ @RouterOperation(path = "/posts", method = RequestMethod.GET, headers = {"x-header1=test1","x-header2=test2"}, operation = @Operation(operationId = "all",
50+
parameters = { @Parameter(name = "key", description = "sample description"),@Parameter(name = "test", description = "sample desc")},
4951
responses = @ApiResponse(responseCode = "200", content = @Content(array = @ArraySchema(schema = @Schema(implementation = Post.class)))))),
5052
@RouterOperation(path = "/posts", method = RequestMethod.POST, operation = @Operation(operationId = "create",
5153
requestBody = @RequestBody(content = @Content(schema = @Schema(implementation = Post.class))), responses = @ApiResponse(responseCode = "201"))),
@@ -57,7 +59,7 @@ class PostRouter {
5759
responses = @ApiResponse(responseCode = "202", content = @Content(schema = @Schema(implementation = Post.class))))) })
5860
@Bean
5961
public RouterFunction<ServerResponse> routes(PostHandler postController) {
60-
return route(GET("/posts"), postController::all)
62+
return route(GET("/posts").and(queryParam("key", "value")), postController::all)
6163
.andRoute(POST("/posts"), postController::create)
6264
.andRoute(GET("/posts/{id}"), postController::get)
6365
.andRoute(PUT("/posts/{id}"), postController::update);

springdoc-openapi-webflux-core/src/test/resources/results/app75.json

+40
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,46 @@
1414
"/posts": {
1515
"get": {
1616
"operationId": "all",
17+
"parameters": [
18+
{
19+
"name": "key",
20+
"in": "query",
21+
"description": "sample description",
22+
"required": true,
23+
"schema": {
24+
"type": "string",
25+
"default": "value"
26+
}
27+
},
28+
{
29+
"name": "test",
30+
"in": "query",
31+
"description": "sample desc",
32+
"schema": {
33+
"type": "string"
34+
}
35+
},
36+
{
37+
"name": "x-header1",
38+
"in": "header",
39+
"schema": {
40+
"type": "string",
41+
"enum": [
42+
"test1"
43+
]
44+
}
45+
},
46+
{
47+
"name": "x-header2",
48+
"in": "header",
49+
"schema": {
50+
"type": "string",
51+
"enum": [
52+
"test2"
53+
]
54+
}
55+
}
56+
],
1757
"responses": {
1858
"200": {
1959
"description": "OK",

0 commit comments

Comments
 (0)