Skip to content

Commit 4f5d222

Browse files
author
bnasslahsen
committed
spring-boot-1 support ...
1 parent da66838 commit 4f5d222

File tree

7 files changed

+144
-100
lines changed

7 files changed

+144
-100
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,14 @@ public class MultipleOpenApiResource implements InitializingBean {
7979

8080
private final Optional<List<OperationCustomizer>> operationCustomizers;
8181

82+
private final Optional<RouterFunctionProvider> routerFunctionProvider;
83+
8284
public MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
8385
ObjectFactory<OpenAPIBuilder> defaultOpenAPIBuilder, AbstractRequestBuilder requestBuilder,
8486
GenericResponseBuilder responseBuilder, OperationBuilder operationParser, Optional<List<OperationCustomizer>> operationCustomizers,
8587
RequestMappingInfoHandlerMapping requestMappingHandlerMapping, Optional<ActuatorProvider> servletContextProvider,
86-
SpringDocConfigProperties springDocConfigProperties, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider) {
88+
SpringDocConfigProperties springDocConfigProperties, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
89+
Optional<RouterFunctionProvider> routerFunctionProvider) {
8790

8891
this.groupedOpenApis = groupedOpenApis;
8992
this.defaultOpenAPIBuilder = defaultOpenAPIBuilder;
@@ -94,6 +97,7 @@ public MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
9497
this.servletContextProvider = servletContextProvider;
9598
this.springDocConfigProperties = springDocConfigProperties;
9699
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
100+
this.routerFunctionProvider = routerFunctionProvider;
97101
if (operationCustomizers.isPresent())
98102
operationCustomizers.get().removeIf(Objects::isNull);
99103
this.operationCustomizers = operationCustomizers;
@@ -116,7 +120,8 @@ public void afterPropertiesSet() throws Exception {
116120
operationCustomizers,
117121
Optional.of(item.getOpenApiCustomisers()),
118122
springDocConfigProperties,
119-
springSecurityOAuth2Provider
123+
springSecurityOAuth2Provider,
124+
routerFunctionProvider
120125
);
121126
}
122127
));

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

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,9 @@
4444
import org.springdoc.core.SpringDocConfigProperties;
4545
import org.springdoc.core.customizers.OpenApiCustomiser;
4646
import org.springdoc.core.customizers.OperationCustomizer;
47-
import org.springdoc.webmvc.core.visitor.RouterFunctionVisitor;
4847

4948
import org.springframework.beans.factory.annotation.Autowired;
5049
import org.springframework.beans.factory.annotation.Value;
51-
import org.springframework.context.ApplicationContext;
5250
import org.springframework.core.annotation.AnnotationUtils;
5351
import org.springframework.http.MediaType;
5452
import org.springframework.web.bind.annotation.GetMapping;
@@ -57,7 +55,6 @@
5755
import org.springframework.web.bind.annotation.RestController;
5856
import org.springframework.web.method.HandlerMethod;
5957
import org.springframework.web.servlet.ModelAndView;
60-
import org.springframework.web.servlet.function.RouterFunction;
6158
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
6259
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
6360
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
@@ -77,33 +74,39 @@ public class OpenApiResource extends AbstractOpenApiResource {
7774

7875
private final Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider;
7976

77+
private final Optional<RouterFunctionProvider> routerFunctionProvider;
78+
8079
public OpenApiResource(String groupName, OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
8180
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
8281
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
8382
Optional<ActuatorProvider> servletContextProvider,
8483
Optional<List<OperationCustomizer>> operationCustomizers,
8584
Optional<List<OpenApiCustomiser>> openApiCustomisers,
8685
SpringDocConfigProperties springDocConfigProperties,
87-
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider) {
86+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
87+
Optional<RouterFunctionProvider> routerFunctionProvider) {
8888
super(groupName, openAPIBuilder, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties);
8989
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
9090
this.servletContextProvider = servletContextProvider;
9191
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
92+
this.routerFunctionProvider = routerFunctionProvider;
9293
}
9394

9495
@Autowired
95-
public OpenApiResource( OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
96+
public OpenApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBuilder requestBuilder,
9697
GenericResponseBuilder responseBuilder, OperationBuilder operationParser,
9798
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
9899
Optional<ActuatorProvider> servletContextProvider,
99100
Optional<List<OperationCustomizer>> operationCustomizers,
100101
Optional<List<OpenApiCustomiser>> openApiCustomisers,
101102
SpringDocConfigProperties springDocConfigProperties,
102-
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider) {
103-
super(DEFAULT_GROUP_NAME, openAPIBuilder, requestBuilder, responseBuilder, operationParser,operationCustomizers, openApiCustomisers, springDocConfigProperties);
103+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
104+
Optional<RouterFunctionProvider> routerFunctionProvider) {
105+
super(DEFAULT_GROUP_NAME, openAPIBuilder, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties);
104106
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
105107
this.servletContextProvider = servletContextProvider;
106108
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
109+
this.routerFunctionProvider = routerFunctionProvider;
107110
}
108111

109112
@Operation(hidden = true)
@@ -165,19 +168,10 @@ && isPathToMatch(operationPath)) {
165168
}
166169
}
167170
}
168-
getWebMvcRouterFunctionPaths();
171+
routerFunctionProvider.ifPresent(routerFunctions -> routerFunctions.getWebMvcRouterFunctionPaths()
172+
.ifPresent(routerBeans -> routerBeans.forEach((beanName, routerFunctionVisitor) -> getRouterFunctionPaths(beanName, routerFunctionVisitor))));
169173
}
170174

171-
protected void getWebMvcRouterFunctionPaths() {
172-
ApplicationContext applicationContext = requestMappingHandlerMapping.getApplicationContext();
173-
Map<String, RouterFunction> routerBeans = applicationContext.getBeansOfType(RouterFunction.class);
174-
for (Map.Entry<String, RouterFunction> entry : routerBeans.entrySet()) {
175-
RouterFunction routerFunction = entry.getValue();
176-
RouterFunctionVisitor routerFunctionVisitor = new RouterFunctionVisitor();
177-
routerFunction.accept(routerFunctionVisitor);
178-
getRouterFunctionPaths(entry.getKey(), routerFunctionVisitor);
179-
}
180-
}
181175

182176
protected boolean isRestController(Map<String, Object> restControllers, HandlerMethod handlerMethod,
183177
String operationPath) {
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/*
2+
*
3+
* *
4+
* * * Copyright 2019-2020 the original author or authors.
5+
* * *
6+
* * * Licensed under the Apache License, Version 2.0 (the "License");
7+
* * * you may not use this file except in compliance with the License.
8+
* * * You may obtain a copy of the License at
9+
* * *
10+
* * * https://www.apache.org/licenses/LICENSE-2.0
11+
* * *
12+
* * * Unless required by applicable law or agreed to in writing, software
13+
* * * distributed under the License is distributed on an "AS IS" BASIS,
14+
* * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* * * See the License for the specific language governing permissions and
16+
* * * limitations under the License.
17+
* *
18+
*
19+
*/
20+
21+
package org.springdoc.webmvc.api;
22+
23+
import java.util.HashMap;
24+
import java.util.Map;
25+
import java.util.Optional;
26+
import java.util.function.Function;
27+
28+
import org.springdoc.core.models.RouterFunctionData;
29+
import org.springdoc.core.visitor.AbstractRouterFunctionVisitor;
30+
31+
import org.springframework.context.ApplicationContext;
32+
import org.springframework.core.io.Resource;
33+
import org.springframework.util.CollectionUtils;
34+
import org.springframework.web.servlet.function.HandlerFunction;
35+
import org.springframework.web.servlet.function.RequestPredicate;
36+
import org.springframework.web.servlet.function.RequestPredicates;
37+
import org.springframework.web.servlet.function.RouterFunction;
38+
import org.springframework.web.servlet.function.RouterFunctions;
39+
import org.springframework.web.servlet.function.ServerRequest;
40+
41+
//To keep compatiblity with spring-boot 1
42+
public class RouterFunctionProvider {
43+
44+
private ApplicationContext applicationContext;
45+
46+
public RouterFunctionProvider(ApplicationContext applicationContext) {
47+
this.applicationContext = applicationContext;
48+
}
49+
50+
protected Optional<Map<String, AbstractRouterFunctionVisitor>> getWebMvcRouterFunctionPaths() {
51+
Map<String, RouterFunction> routerBeans = applicationContext.getBeansOfType(RouterFunction.class);
52+
if (CollectionUtils.isEmpty(routerBeans))
53+
return Optional.empty();
54+
Map<String, AbstractRouterFunctionVisitor> routerFunctionVisitorMap = new HashMap<>();
55+
for (Map.Entry<String, RouterFunction> entry : routerBeans.entrySet()) {
56+
RouterFunction routerFunction = entry.getValue();
57+
RouterFunctionVisitor routerFunctionVisitor = new RouterFunctionVisitor();
58+
routerFunction.accept(routerFunctionVisitor);
59+
routerFunctionVisitorMap.put(entry.getKey(), routerFunctionVisitor);
60+
}
61+
return Optional.of(routerFunctionVisitorMap);
62+
}
63+
64+
private class RouterFunctionVisitor extends AbstractRouterFunctionVisitor implements RouterFunctions.Visitor, RequestPredicates.Visitor {
65+
@Override
66+
public void route(RequestPredicate predicate, HandlerFunction<?> handlerFunction) {
67+
this.routerFunctionData = new RouterFunctionData();
68+
routerFunctionDatas.add(this.routerFunctionData);
69+
predicate.accept(this);
70+
}
71+
72+
@Override
73+
public void resources(Function<ServerRequest, Optional<Resource>> lookupFunction) {
74+
// Not yet needed
75+
}
76+
77+
@Override
78+
public void unknown(RouterFunction<?> routerFunction) {
79+
// Not yet needed
80+
}
81+
82+
@Override
83+
public void unknown(RequestPredicate predicate) {
84+
// Not yet needed
85+
}
86+
87+
@Override
88+
public void startNested(RequestPredicate predicate) {
89+
// Not yet needed
90+
}
91+
92+
@Override
93+
public void endNested(RequestPredicate predicate) {
94+
// Not yet needed
95+
}
96+
97+
}
98+
}

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/MultipleOpenApiSupportConfiguration.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springdoc.core.customizers.OperationCustomizer;
3535
import org.springdoc.webmvc.api.ActuatorProvider;
3636
import org.springdoc.webmvc.api.MultipleOpenApiResource;
37+
import org.springdoc.webmvc.api.RouterFunctionProvider;
3738

3839
import org.springframework.beans.factory.ObjectFactory;
3940
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -64,12 +65,14 @@ MultipleOpenApiResource multipleOpenApiResource(List<GroupedOpenApi> groupedOpen
6465
RequestMappingInfoHandlerMapping requestMappingHandlerMapping,
6566
Optional<ActuatorProvider> servletContextProvider,
6667
SpringDocConfigProperties springDocConfigProperties,
67-
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider) {
68+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
69+
Optional<RouterFunctionProvider> routerFunctionProvider) {
6870
return new MultipleOpenApiResource(groupedOpenApis,
6971
defaultOpenAPIBuilder, requestBuilder,
7072
responseBuilder, operationParser,operationCustomizers,
7173
requestMappingHandlerMapping, servletContextProvider,
7274
springDocConfigProperties,
73-
springSecurityOAuth2Provider);
75+
springSecurityOAuth2Provider,
76+
routerFunctionProvider);
7477
}
7578
}

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/SpringDocWebMvcConfiguration.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.springdoc.core.customizers.ParameterCustomizer;
4040
import org.springdoc.webmvc.api.ActuatorProvider;
4141
import org.springdoc.webmvc.api.OpenApiResource;
42+
import org.springdoc.webmvc.api.RouterFunctionProvider;
4243

4344
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
4445
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
@@ -47,11 +48,13 @@
4748
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
4849
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
4950
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
51+
import org.springframework.context.ApplicationContext;
5052
import org.springframework.context.annotation.Bean;
5153
import org.springframework.context.annotation.Configuration;
5254
import org.springframework.context.annotation.Lazy;
5355
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
5456
import org.springframework.web.method.HandlerMethod;
57+
import org.springframework.web.servlet.function.RouterFunction;
5558
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
5659

5760
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
@@ -72,11 +75,13 @@ OpenApiResource openApiResource(OpenAPIBuilder openAPIBuilder, AbstractRequestBu
7275
SpringDocConfigProperties springDocConfigProperties,
7376
Optional<List<OperationCustomizer>> operationCustomizers,
7477
Optional<List<OpenApiCustomiser>> openApiCustomisers,
75-
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider) {
78+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
79+
Optional<RouterFunctionProvider> routerFunctionProvider) {
7680
return new OpenApiResource(openAPIBuilder, requestBuilder,
7781
responseBuilder, operationParser,
78-
requestMappingHandlerMapping, servletContextProvider,operationCustomizers,
79-
openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider);
82+
requestMappingHandlerMapping, servletContextProvider, operationCustomizers,
83+
openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider,
84+
routerFunctionProvider);
8085
}
8186

8287
@Bean
@@ -94,6 +99,16 @@ GenericResponseBuilder responseBuilder(OperationBuilder operationBuilder, List<R
9499
return new GenericResponseBuilder(operationBuilder, returnTypeParsers, springDocConfigProperties, propertyResolverUtils);
95100
}
96101

102+
@ConditionalOnClass(RouterFunction.class)
103+
class SpringDocWebMvcRouterConfiguration {
104+
105+
@Bean
106+
@ConditionalOnMissingBean
107+
RouterFunctionProvider routerFunctionProvider(ApplicationContext applicationContext) {
108+
return new RouterFunctionProvider(applicationContext);
109+
}
110+
}
111+
97112
@ConditionalOnProperty(SPRINGDOC_SHOW_ACTUATOR)
98113
@ConditionalOnClass(WebMvcEndpointHandlerMapping.class)
99114
@ConditionalOnManagementPort(ManagementPortType.SAME)

springdoc-openapi-webmvc-core/src/main/java/org/springdoc/webmvc/core/visitor/RouterFunctionVisitor.java

Lines changed: 0 additions & 73 deletions
This file was deleted.

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app94/SpringDocApp94Test.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.springdoc.core.customizers.OperationCustomizer;
3939
import org.springdoc.webmvc.api.ActuatorProvider;
4040
import org.springdoc.webmvc.api.OpenApiResource;
41+
import org.springdoc.webmvc.api.RouterFunctionProvider;
4142
import test.org.springdoc.api.AbstractSpringDocTest;
4243
import test.org.springdoc.api.app91.Greeting;
4344

@@ -94,9 +95,10 @@ public OpenApiResource openApiResource(OpenAPIBuilder openAPIBuilder, AbstractRe
9495
OperationBuilder operationParser,Optional<List<OperationCustomizer>> operationCustomizers,
9596
@Qualifier("defaultTestHandlerMapping") RequestMappingHandlerMapping requestMappingHandlerMapping,
9697
Optional<ActuatorProvider> servletContextProvider, SpringDocConfigProperties springDocConfigProperties,
97-
Optional<List<OpenApiCustomiser>> openApiCustomisers, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider) {
98+
Optional<List<OpenApiCustomiser>> openApiCustomisers, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
99+
Optional<RouterFunctionProvider> routerFunctionProvider) {
98100
return new OpenApiResource(DEFAULT_GROUP_NAME, openAPIBuilder, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping,
99-
servletContextProvider,operationCustomizers, openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider);
101+
servletContextProvider,operationCustomizers, openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider,routerFunctionProvider);
100102
}
101103

102104
@Override

0 commit comments

Comments
 (0)