Skip to content

Commit e8f24cd

Browse files
author
bnasslahsen
committed
Improve support of Webflux with Functional Endpoints
1 parent f3703e7 commit e8f24cd

File tree

3 files changed

+24
-41
lines changed

3 files changed

+24
-41
lines changed

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,12 @@
5858
import org.springdoc.core.OperationBuilder;
5959
import org.springdoc.core.SpringDocConfigProperties;
6060
import org.springdoc.core.SpringDocConfigProperties.GroupConfig;
61+
import org.springdoc.core.annotations.RouterOperations;
6162
import org.springdoc.core.customizers.OpenApiCustomiser;
6263
import org.springdoc.core.customizers.OperationCustomizer;
6364
import org.springdoc.core.models.RouterFunctionData;
6465
import org.springdoc.core.models.RouterOperation;
66+
import org.springdoc.core.visitor.AbstractRouterFunctionVisitor;
6567

6668
import org.springframework.context.ApplicationContext;
6769
import org.springframework.core.annotation.AnnotatedElementUtils;
@@ -295,6 +297,25 @@ else if (StringUtils.isNotBlank(routerOperation.getOperation().operationId())) {
295297
}
296298
}
297299

300+
protected void getRouterFunctionPaths(String beanName, AbstractRouterFunctionVisitor routerFunctionVisitor) {
301+
List<org.springdoc.core.annotations.RouterOperation> routerOperationList = new ArrayList<>();
302+
ApplicationContext applicationContext = openAPIBuilder.getContext();
303+
RouterOperations routerOperations = applicationContext.findAnnotationOnBean(beanName, RouterOperations.class);
304+
if (routerOperations == null) {
305+
org.springdoc.core.annotations.RouterOperation routerOperation = applicationContext.findAnnotationOnBean(beanName, org.springdoc.core.annotations.RouterOperation.class);
306+
routerOperationList.add(routerOperation);
307+
}
308+
else
309+
routerOperationList.addAll(Arrays.asList(routerOperations.value()));
310+
if (routerOperationList.size() == 1)
311+
calculatePath(routerOperationList.stream().map(routerOperation -> new org.springdoc.core.models.RouterOperation(routerOperation, routerFunctionVisitor.getRouterFunctionDatas().get(0))).collect(Collectors.toList()));
312+
else {
313+
List<org.springdoc.core.models.RouterOperation> operationList = routerOperationList.stream().map(org.springdoc.core.models.RouterOperation::new).collect(Collectors.toList());
314+
merge(routerFunctionVisitor.getRouterFunctionDatas(), operationList);
315+
calculatePath(operationList);
316+
}
317+
}
318+
298319
private void calculateJsonView(io.swagger.v3.oas.annotations.Operation apiOperation,
299320
MethodAttributes methodAttributes, Method method) {
300321
JsonView jsonViewAnnotation;

springdoc-openapi-webflux-core/src/main/java/org/springdoc/webflux/api/OpenApiResource.java

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,11 @@
2020

2121
package org.springdoc.webflux.api;
2222

23-
import java.util.ArrayList;
24-
import java.util.Arrays;
2523
import java.util.LinkedHashMap;
2624
import java.util.List;
2725
import java.util.Map;
2826
import java.util.Optional;
2927
import java.util.Set;
30-
import java.util.stream.Collectors;
3128

3229
import com.fasterxml.jackson.core.JsonProcessingException;
3330
import io.swagger.v3.core.util.Json;
@@ -41,8 +38,6 @@
4138
import org.springdoc.core.OpenAPIBuilder;
4239
import org.springdoc.core.OperationBuilder;
4340
import org.springdoc.core.SpringDocConfigProperties;
44-
import org.springdoc.core.annotations.RouterOperation;
45-
import org.springdoc.core.annotations.RouterOperations;
4641
import org.springdoc.core.customizers.OpenApiCustomiser;
4742
import org.springdoc.core.customizers.OperationCustomizer;
4843
import org.springdoc.webflux.core.visitor.RouterFunctionVisitor;
@@ -143,21 +138,7 @@ protected void getWebFluxRouterFunctionPaths() {
143138
RouterFunction routerFunction = entry.getValue();
144139
RouterFunctionVisitor routerFunctionVisitor = new RouterFunctionVisitor();
145140
routerFunction.accept(routerFunctionVisitor);
146-
List<RouterOperation> routerOperationList = new ArrayList<>();
147-
RouterOperations routerOperations = applicationContext.findAnnotationOnBean(entry.getKey(), RouterOperations.class);
148-
if (routerOperations == null) {
149-
RouterOperation routerOperation = applicationContext.findAnnotationOnBean(entry.getKey(), RouterOperation.class);
150-
routerOperationList.add(routerOperation);
151-
}
152-
else
153-
routerOperationList.addAll(Arrays.asList(routerOperations.value()));
154-
if (routerOperationList.size() == 1)
155-
calculatePath(routerOperationList.stream().map(routerOperation -> new org.springdoc.core.models.RouterOperation(routerOperation, routerFunctionVisitor.getRouterFunctionDatas().get(0))).collect(Collectors.toList()));
156-
else {
157-
List<org.springdoc.core.models.RouterOperation> operationList = routerOperationList.stream().map(org.springdoc.core.models.RouterOperation::new).collect(Collectors.toList());
158-
merge(routerFunctionVisitor.getRouterFunctionDatas(), operationList);
159-
calculatePath(operationList);
160-
}
141+
getRouterFunctionPaths(entry.getKey(), routerFunctionVisitor);
161142
}
162143
}
163144

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/api/OpenApiResource.java

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,12 @@
2020

2121
package org.springdoc.webmvc.api;
2222

23-
import java.util.ArrayList;
24-
import java.util.Arrays;
2523
import java.util.HashSet;
2624
import java.util.LinkedHashMap;
2725
import java.util.List;
2826
import java.util.Map;
2927
import java.util.Optional;
3028
import java.util.Set;
31-
import java.util.stream.Collectors;
3229

3330
import javax.servlet.http.HttpServletRequest;
3431

@@ -45,8 +42,6 @@
4542
import org.springdoc.core.OperationBuilder;
4643
import org.springdoc.core.SecurityOAuth2Provider;
4744
import org.springdoc.core.SpringDocConfigProperties;
48-
import org.springdoc.core.annotations.RouterOperation;
49-
import org.springdoc.core.annotations.RouterOperations;
5045
import org.springdoc.core.customizers.OpenApiCustomiser;
5146
import org.springdoc.core.customizers.OperationCustomizer;
5247
import org.springdoc.webmvc.core.visitor.RouterFunctionVisitor;
@@ -149,7 +144,7 @@ protected void getPaths(Map<String, Object> restControllers) {
149144
}
150145
}
151146

152-
private void calculatePath(Map<String, Object> restControllers, Map<RequestMappingInfo, HandlerMethod> map, Optional<ActuatorProvider> actuatorProvider) {
147+
protected void calculatePath(Map<String, Object> restControllers, Map<RequestMappingInfo, HandlerMethod> map, Optional<ActuatorProvider> actuatorProvider) {
153148
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : map.entrySet()) {
154149
RequestMappingInfo requestMappingInfo = entry.getKey();
155150
HandlerMethod handlerMethod = entry.getValue();
@@ -180,21 +175,7 @@ protected void getWebMvcRouterFunctionPaths() {
180175
RouterFunction routerFunction = entry.getValue();
181176
RouterFunctionVisitor routerFunctionVisitor = new RouterFunctionVisitor();
182177
routerFunction.accept(routerFunctionVisitor);
183-
List<RouterOperation> routerOperationList = new ArrayList<>();
184-
RouterOperations routerOperations = applicationContext.findAnnotationOnBean(entry.getKey(), RouterOperations.class);
185-
if (routerOperations == null) {
186-
RouterOperation routerOperation = applicationContext.findAnnotationOnBean(entry.getKey(), RouterOperation.class);
187-
routerOperationList.add(routerOperation);
188-
}
189-
else
190-
routerOperationList.addAll(Arrays.asList(routerOperations.value()));
191-
if (routerOperationList.size() == 1)
192-
calculatePath(routerOperationList.stream().map(routerOperation -> new org.springdoc.core.models.RouterOperation(routerOperation, routerFunctionVisitor.getRouterFunctionDatas().get(0))).collect(Collectors.toList()));
193-
else {
194-
List<org.springdoc.core.models.RouterOperation> operationList = routerOperationList.stream().map(org.springdoc.core.models.RouterOperation::new).collect(Collectors.toList());
195-
merge(routerFunctionVisitor.getRouterFunctionDatas(), operationList);
196-
calculatePath(operationList);
197-
}
178+
getRouterFunctionPaths(entry.getKey(), routerFunctionVisitor);
198179
}
199180
}
200181

0 commit comments

Comments
 (0)