Skip to content

Commit e54d7c2

Browse files
author
bnasslahsen
committed
Improve support of Webflux with Functional Endpoints
1 parent a433f57 commit e54d7c2

File tree

7 files changed

+193
-271
lines changed

7 files changed

+193
-271
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package org.springdoc.core.visitor;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
import org.springdoc.core.models.RouterFunctionData;
8+
9+
import org.springframework.http.HttpHeaders;
10+
import org.springframework.http.HttpMethod;
11+
12+
public class AbstractRouterFunctionVisitor {
13+
14+
protected List<RouterFunctionData> routerFunctionDatas = new ArrayList<>();
15+
16+
protected RouterFunctionData routerFunctionData;
17+
18+
public void method(Set<HttpMethod> methods) {
19+
routerFunctionData.setMethods(methods);
20+
}
21+
22+
public void path(String pattern) {
23+
routerFunctionData.setPath(pattern);
24+
}
25+
26+
public void header(String name, String value) {
27+
if (HttpHeaders.ACCEPT.equals(name))
28+
routerFunctionData.setConsumes(value);
29+
else
30+
routerFunctionData.setHeaders(name + "=" + value);
31+
}
32+
33+
public List<RouterFunctionData> getRouterFunctionDatas() {
34+
return routerFunctionDatas;
35+
}
36+
37+
public void queryParam(String name, String value) {
38+
// Not yet needed
39+
}
40+
41+
public void pathExtension(String extension) {
42+
// Not yet needed
43+
}
44+
45+
public void param(String name, String value) {
46+
// Not yet needed
47+
}
48+
49+
public void startAnd() {
50+
// Not yet needed
51+
}
52+
53+
public void and() {
54+
// Not yet needed
55+
}
56+
57+
public void endAnd() {
58+
// Not yet needed
59+
}
60+
61+
public void startOr() {
62+
// Not yet needed
63+
}
64+
65+
public void or() {
66+
// Not yet needed
67+
}
68+
69+
public void endOr() {
70+
// Not yet needed
71+
}
72+
73+
public void startNegate() {
74+
// Not yet needed
75+
}
76+
77+
public void endNegate() {
78+
// Not yet needed
79+
}
80+
81+
82+
83+
84+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.springdoc.core.annotations.RouterOperations;
4444
import org.springdoc.core.customizers.OpenApiCustomiser;
4545
import org.springdoc.core.customizers.OperationCustomizer;
46+
import org.springdoc.webflux.core.visitor.RouterFunctionVisitor;
4647
import reactor.core.publisher.Mono;
4748

4849
import org.springframework.beans.factory.annotation.Autowired;
@@ -133,7 +134,7 @@ protected void getPaths(Map<String, Object> restControllers) {
133134
getWebFluxRouterFunctionPaths();
134135
}
135136

136-
private void getWebFluxRouterFunctionPaths() {
137+
protected void getWebFluxRouterFunctionPaths() {
137138
ApplicationContext applicationContext = requestMappingHandlerMapping.getApplicationContext();
138139
Map<String, RouterFunction> routerBeans = applicationContext.getBeansOfType(RouterFunction.class);
139140
for (Map.Entry<String, RouterFunction> entry : routerBeans.entrySet()) {

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

Lines changed: 0 additions & 135 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.springdoc.webflux.core.visitor;
2+
3+
import java.util.function.Function;
4+
5+
import org.springdoc.core.models.RouterFunctionData;
6+
import org.springdoc.core.visitor.AbstractRouterFunctionVisitor;
7+
import reactor.core.publisher.Mono;
8+
9+
import org.springframework.core.io.Resource;
10+
import org.springframework.web.reactive.function.server.HandlerFunction;
11+
import org.springframework.web.reactive.function.server.RequestPredicate;
12+
import org.springframework.web.reactive.function.server.RequestPredicates;
13+
import org.springframework.web.reactive.function.server.RouterFunction;
14+
import org.springframework.web.reactive.function.server.RouterFunctions;
15+
import org.springframework.web.reactive.function.server.ServerRequest;
16+
17+
public class RouterFunctionVisitor extends AbstractRouterFunctionVisitor implements RouterFunctions.Visitor, RequestPredicates.Visitor {
18+
19+
@Override
20+
public void route(RequestPredicate predicate, HandlerFunction<?> handlerFunction) {
21+
this.routerFunctionData = new RouterFunctionData();
22+
routerFunctionDatas.add(this.routerFunctionData);
23+
predicate.accept(this);
24+
}
25+
26+
@Override
27+
public void startNested(RequestPredicate predicate) {
28+
// Not yet needed
29+
}
30+
31+
@Override
32+
public void endNested(RequestPredicate predicate) {
33+
// Not yet needed
34+
}
35+
36+
@Override
37+
public void resources(Function<ServerRequest, Mono<Resource>> lookupFunction) {
38+
// Not yet needed
39+
}
40+
41+
@Override
42+
public void unknown(RouterFunction<?> routerFunction) {
43+
// Not yet needed
44+
}
45+
46+
@Override
47+
public void unknown(RequestPredicate predicate) {
48+
// Not yet needed
49+
}
50+
}
51+
52+

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springdoc.core.annotations.RouterOperations;
4848
import org.springdoc.core.customizers.OpenApiCustomiser;
4949
import org.springdoc.core.customizers.OperationCustomizer;
50+
import org.springdoc.webmvc.core.visitor.RouterFunctionVisitor;
5051

5152
import org.springframework.beans.factory.annotation.Autowired;
5253
import org.springframework.beans.factory.annotation.Value;
@@ -170,7 +171,7 @@ && isPathToMatch(operationPath)) {
170171
getWebMvcRouterFunctionPaths();
171172
}
172173

173-
private void getWebMvcRouterFunctionPaths() {
174+
protected void getWebMvcRouterFunctionPaths() {
174175
ApplicationContext applicationContext = requestMappingHandlerMapping.getApplicationContext();
175176
Map<String, RouterFunction> routerBeans = applicationContext.getBeansOfType(RouterFunction.class);
176177
for (Map.Entry<String, RouterFunction> entry : routerBeans.entrySet()) {

0 commit comments

Comments
 (0)