Skip to content

Commit b126779

Browse files
committed
Break circular references which disabled by default since spring boot 2.6. Fixes springdoc#1347.
1 parent 98e00f0 commit b126779

File tree

39 files changed

+698
-311
lines changed

39 files changed

+698
-311
lines changed

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

+1-3
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@
4545

4646
import org.springframework.beans.BeansException;
4747
import org.springframework.beans.factory.ObjectFactory;
48-
import org.springframework.beans.factory.annotation.Qualifier;
4948
import org.springframework.boot.autoconfigure.SpringBootApplication;
5049
import org.springframework.context.ApplicationContext;
5150
import org.springframework.context.ApplicationContextAware;
@@ -138,11 +137,10 @@ public RequestMappingHandlerMapping defaultTestHandlerMapping(GreetingController
138137
@Bean(name = "openApiResource")
139138
public OpenApiWebMvcResource openApiResource(ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory, AbstractRequestService requestBuilder, GenericResponseService responseBuilder,
140139
OperationService operationParser,Optional<List<OperationCustomizer>> operationCustomizers,
141-
@Qualifier("defaultTestHandlerMapping") RequestMappingHandlerMapping requestMappingHandlerMapping,
142140
Optional<ActuatorProvider> actuatorProvider, SpringDocConfigProperties springDocConfigProperties,
143141
Optional<List<OpenApiCustomiser>> openApiCustomisers, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
144142
Optional<RouterFunctionProvider> routerFunctionProvider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider) {
145-
return new OpenApiWebMvcResource(DEFAULT_GROUP_NAME, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping,
143+
return new OpenApiWebMvcResource(DEFAULT_GROUP_NAME, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser,
146144
actuatorProvider,operationCustomizers, openApiCustomisers, springDocConfigProperties, springSecurityOAuth2Provider,routerFunctionProvider, repositoryRestResourceProvider);
147145
}
148146

springdoc-openapi-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerConfig.java

+4-6
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
package org.springdoc.webmvc.ui;
2222

23-
import java.util.List;
2423
import java.util.Optional;
2524

2625
import com.fasterxml.jackson.databind.ObjectMapper;
2726
import org.springdoc.core.ActuatorProvider;
27+
import org.springdoc.core.OpenAPIService;
2828
import org.springdoc.core.SpringDocConfigProperties;
2929
import org.springdoc.core.SpringDocConfiguration;
3030
import org.springdoc.core.SwaggerUiConfigParameters;
@@ -42,7 +42,6 @@
4242
import org.springframework.context.annotation.Bean;
4343
import org.springframework.context.annotation.Configuration;
4444
import org.springframework.context.annotation.Lazy;
45-
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
4645

4746
import static org.springdoc.core.Constants.SPRINGDOC_SWAGGER_UI_ENABLED;
4847
import static org.springdoc.core.Constants.SPRINGDOC_USE_MANAGEMENT_PORT;
@@ -59,21 +58,20 @@
5958
@ConditionalOnBean(SpringDocConfiguration.class)
6059
public class SwaggerConfig {
6160

62-
6361
/**
6462
* Swagger welcome swagger welcome web mvc.
6563
*
6664
* @param swaggerUiConfig the swagger ui config
6765
* @param springDocConfigProperties the spring doc config properties
6866
* @param swaggerUiConfigParameters the swagger ui config parameters
69-
* @param requestMappingInfoHandlerMappingOptionalList the request mapping info handler mapping optional list
67+
* @param openAPIService the open api service
7068
* @return the swagger welcome web mvc
7169
*/
7270
@Bean
7371
@ConditionalOnMissingBean
7472
@ConditionalOnProperty(name = SPRINGDOC_USE_MANAGEMENT_PORT, havingValue = "false", matchIfMissing = true)
75-
SwaggerWelcomeWebMvc swaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList) {
76-
return new SwaggerWelcomeWebMvc(swaggerUiConfig, springDocConfigProperties,swaggerUiConfigParameters, requestMappingInfoHandlerMappingOptionalList);
73+
SwaggerWelcomeWebMvc swaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, OpenAPIService openAPIService) {
74+
return new SwaggerWelcomeWebMvc(swaggerUiConfig, springDocConfigProperties,swaggerUiConfigParameters, openAPIService);
7775
}
7876

7977
/**

springdoc-openapi-ui/src/main/java/org/springdoc/webmvc/ui/SwaggerWelcomeWebMvc.java

+10-44
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,24 @@
2020

2121
package org.springdoc.webmvc.ui;
2222

23-
import java.util.ArrayList;
24-
import java.util.List;
25-
import java.util.Map;
26-
import java.util.Map.Entry;
27-
import java.util.Optional;
28-
import java.util.Set;
29-
30-
import javax.annotation.PostConstruct;
3123
import javax.servlet.http.HttpServletRequest;
3224

3325
import io.swagger.v3.oas.annotations.Operation;
3426
import org.apache.commons.lang3.StringUtils;
27+
import org.springdoc.core.OpenAPIService;
3528
import org.springdoc.core.SpringDocConfigProperties;
3629
import org.springdoc.core.SwaggerUiConfigParameters;
3730
import org.springdoc.core.SwaggerUiConfigProperties;
38-
import org.springdoc.webmvc.api.OpenApiResource;
3931

4032
import org.springframework.beans.factory.annotation.Value;
4133
import org.springframework.http.ResponseEntity;
4234
import org.springframework.stereotype.Controller;
43-
import org.springframework.util.CollectionUtils;
4435
import org.springframework.web.bind.annotation.GetMapping;
45-
import org.springframework.web.method.HandlerMethod;
46-
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
47-
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
4836

4937
import static org.springdoc.core.Constants.MVC_SERVLET_PATH;
5038
import static org.springdoc.core.Constants.SWAGGER_UI_PATH;
5139
import static org.springdoc.core.Constants.SWAGGGER_CONFIG_FILE;
40+
import static org.springdoc.webmvc.api.OpenApiWebMvcResource.findPathPrefix;
5241
import static org.springframework.util.AntPathMatcher.DEFAULT_PATH_SEPARATOR;
5342

5443
/**
@@ -71,46 +60,20 @@ public class SwaggerWelcomeWebMvc extends SwaggerWelcomeCommon {
7160
private String pathPrefix;
7261

7362
/**
74-
* The Request mapping handler mapping.
63+
* The Open api service.
7564
*/
76-
private final Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList;
77-
65+
private final OpenAPIService openAPIService;
7866

7967
/**
8068
* Instantiates a new Swagger welcome web mvc.
81-
*
8269
* @param swaggerUiConfig the swagger ui config
8370
* @param springDocConfigProperties the spring doc config properties
8471
* @param swaggerUiConfigParameters the swagger ui config parameters
85-
* @param requestMappingInfoHandlerMappingOptionalList the request mapping info handler mapping optional list
72+
* @param openAPIService the open api service
8673
*/
87-
public SwaggerWelcomeWebMvc(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList) {
74+
public SwaggerWelcomeWebMvc(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, OpenAPIService openAPIService) {
8875
super(swaggerUiConfig, springDocConfigProperties, swaggerUiConfigParameters);
89-
this.requestMappingInfoHandlerMappingOptionalList = requestMappingInfoHandlerMappingOptionalList;
90-
}
91-
92-
/**
93-
* Init.
94-
*/
95-
@PostConstruct
96-
private void init() {
97-
requestMappingInfoHandlerMappingOptionalList.ifPresent(requestMappingInfoHandlerMappingList ->
98-
requestMappingInfoHandlerMappingList.forEach(requestMappingHandlerMapping ->
99-
{
100-
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
101-
List<Entry<RequestMappingInfo, HandlerMethod>> entries = new ArrayList<>(map.entrySet());
102-
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
103-
RequestMappingInfo requestMappingInfo = entry.getKey();
104-
Set<String> patterns = OpenApiResource.getActivePatterns(requestMappingInfo);
105-
if (!CollectionUtils.isEmpty(patterns)) {
106-
for (String operationPath : patterns) {
107-
if (operationPath.endsWith(springDocConfigProperties.getApiDocs().getPath()))
108-
pathPrefix = operationPath.replace(springDocConfigProperties.getApiDocs().getPath(), StringUtils.EMPTY);
109-
}
110-
}
111-
}
112-
}
113-
));
76+
this.openAPIService = openAPIService;
11477
}
11578

11679
/**
@@ -160,6 +123,8 @@ protected String buildUrl(String contextPath, final String docsUrl) {
160123
*/
161124
@Override
162125
protected String buildApiDocUrl() {
126+
if (this.pathPrefix == null)
127+
this.pathPrefix = findPathPrefix(this.openAPIService, this.springDocConfigProperties);
163128
return buildUrl(contextPath + pathPrefix, springDocConfigProperties.getApiDocs().getPath());
164129
}
165130

@@ -172,4 +137,5 @@ protected String buildApiDocUrl() {
172137
protected String buildSwaggerConfigUrl() {
173138
return apiDocsUrl + DEFAULT_PATH_SEPARATOR + SWAGGGER_CONFIG_FILE;
174139
}
140+
175141
}

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.springframework.http.server.reactive.ServerHttpRequest;
4343
import org.springframework.web.bind.annotation.GetMapping;
4444
import org.springframework.web.bind.annotation.PathVariable;
45-
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
4645

4746
import static org.springdoc.core.Constants.API_DOCS_URL;
4847
import static org.springdoc.core.Constants.APPLICATION_OPENAPI_YAML;
@@ -64,12 +63,11 @@ public class MultipleOpenApiActuatorResource extends MultipleOpenApiResource {
6463
* @param requestBuilder the request builder
6564
* @param responseBuilder the response builder
6665
* @param operationParser the operation parser
67-
* @param requestMappingHandlerMapping the request mapping handler mapping
6866
* @param springDocConfigProperties the spring doc config properties
6967
* @param actuatorProvider the actuator provider
7068
*/
71-
public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, RequestMappingHandlerMapping requestMappingHandlerMapping, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
72-
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping, springDocConfigProperties, actuatorProvider);
69+
public MultipleOpenApiActuatorResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
70+
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, actuatorProvider);
7371
}
7472

7573
/**

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

-11
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737

3838
import org.springframework.beans.factory.InitializingBean;
3939
import org.springframework.beans.factory.ObjectFactory;
40-
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
4140

4241
import static org.springdoc.core.Constants.ACTUATOR_DEFAULT_GROUP;
4342

@@ -72,11 +71,6 @@ public abstract class MultipleOpenApiResource implements InitializingBean {
7271
*/
7372
private final OperationService operationParser;
7473

75-
/**
76-
* The Request mapping handler mapping.
77-
*/
78-
private final RequestMappingHandlerMapping requestMappingHandlerMapping;
79-
8074
/**
8175
* The Spring doc config properties.
8276
*/
@@ -100,22 +94,19 @@ public abstract class MultipleOpenApiResource implements InitializingBean {
10094
* @param requestBuilder the request builder
10195
* @param responseBuilder the response builder
10296
* @param operationParser the operation parser
103-
* @param requestMappingHandlerMapping the request mapping handler mapping
10497
* @param springDocConfigProperties the spring doc config properties
10598
* @param actuatorProvider the actuator provider
10699
*/
107100
public MultipleOpenApiResource(List<GroupedOpenApi> groupedOpenApis,
108101
ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder,
109102
GenericResponseService responseBuilder, OperationService operationParser,
110-
RequestMappingHandlerMapping requestMappingHandlerMapping,
111103
SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
112104

113105
this.groupedOpenApis = groupedOpenApis;
114106
this.defaultOpenAPIBuilder = defaultOpenAPIBuilder;
115107
this.requestBuilder = requestBuilder;
116108
this.responseBuilder = responseBuilder;
117109
this.operationParser = operationParser;
118-
this.requestMappingHandlerMapping = requestMappingHandlerMapping;
119110
this.springDocConfigProperties = springDocConfigProperties;
120111
this.actuatorProvider = actuatorProvider;
121112
}
@@ -145,7 +136,6 @@ private OpenApiResource buildWebFluxOpenApiResource(GroupedOpenApi item) {
145136
requestBuilder,
146137
responseBuilder,
147138
operationParser,
148-
requestMappingHandlerMapping,
149139
Optional.of(item.getOperationCustomizers()),
150140
Optional.of(item.getOpenApiCustomisers()),
151141
springDocConfigProperties,
@@ -157,7 +147,6 @@ private OpenApiResource buildWebFluxOpenApiResource(GroupedOpenApi item) {
157147
requestBuilder,
158148
responseBuilder,
159149
operationParser,
160-
requestMappingHandlerMapping,
161150
Optional.of(item.getOperationCustomizers()),
162151
Optional.of(item.getOpenApiCustomisers()),
163152
springDocConfigProperties,

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.springframework.web.bind.annotation.GetMapping;
4343
import org.springframework.web.bind.annotation.PathVariable;
4444
import org.springframework.web.bind.annotation.RestController;
45-
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
4645

4746
import static org.springdoc.core.Constants.API_DOCS_URL;
4847
import static org.springdoc.core.Constants.APPLICATION_OPENAPI_YAML;
@@ -63,12 +62,11 @@ public class MultipleOpenApiWebFluxResource extends MultipleOpenApiResource {
6362
* @param requestBuilder the request builder
6463
* @param responseBuilder the response builder
6564
* @param operationParser the operation parser
66-
* @param requestMappingHandlerMapping the request mapping handler mapping
6765
* @param springDocConfigProperties the spring doc config properties
6866
* @param actuatorProvider the actuator provider
6967
*/
70-
public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, RequestMappingHandlerMapping requestMappingHandlerMapping, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
71-
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping, springDocConfigProperties, actuatorProvider);
68+
public MultipleOpenApiWebFluxResource(List<GroupedOpenApi> groupedOpenApis, ObjectFactory<OpenAPIService> defaultOpenAPIBuilder, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
69+
super(groupedOpenApis, defaultOpenAPIBuilder, requestBuilder, responseBuilder, operationParser, springDocConfigProperties, actuatorProvider);
7270
}
7371

7472
/**

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

+4-7
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.springframework.http.MediaType;
4343
import org.springframework.http.server.reactive.ServerHttpRequest;
4444
import org.springframework.web.bind.annotation.GetMapping;
45-
import org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerMapping;
4645

4746
import static org.apache.commons.lang3.StringUtils.EMPTY;
4847
import static org.springdoc.core.Constants.APPLICATION_OPENAPI_YAML;
@@ -66,14 +65,13 @@ public class OpenApiActuatorResource extends OpenApiResource {
6665
* @param requestBuilder the request builder
6766
* @param responseBuilder the response builder
6867
* @param operationParser the operation parser
69-
* @param requestMappingHandlerMapping the request mapping handler mapping
7068
* @param operationCustomizers the operation customizers
7169
* @param openApiCustomisers the open api customisers
7270
* @param springDocConfigProperties the spring doc config properties
7371
* @param actuatorProvider the actuator provider
7472
*/
75-
public OpenApiActuatorResource(String groupName, ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, RequestMappingHandlerMapping requestMappingHandlerMapping, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<OpenApiCustomiser>> openApiCustomisers, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
76-
super(groupName, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping, operationCustomizers, openApiCustomisers, springDocConfigProperties, actuatorProvider);
73+
public OpenApiActuatorResource(String groupName, ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<OpenApiCustomiser>> openApiCustomisers, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
74+
super(groupName, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties, actuatorProvider);
7775
}
7876

7977
/**
@@ -83,14 +81,13 @@ public OpenApiActuatorResource(String groupName, ObjectFactory<OpenAPIService> o
8381
* @param requestBuilder the request builder
8482
* @param responseBuilder the response builder
8583
* @param operationParser the operation parser
86-
* @param requestMappingHandlerMapping the request mapping handler mapping
8784
* @param operationCustomizers the operation customizers
8885
* @param openApiCustomisers the open api customisers
8986
* @param springDocConfigProperties the spring doc config properties
9087
* @param actuatorProvider the actuator provider
9188
*/
92-
public OpenApiActuatorResource(ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, RequestMappingHandlerMapping requestMappingHandlerMapping, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<OpenApiCustomiser>> openApiCustomisers, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
93-
super(openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, requestMappingHandlerMapping, operationCustomizers, openApiCustomisers, springDocConfigProperties, actuatorProvider);
89+
public OpenApiActuatorResource(ObjectFactory<OpenAPIService> openAPIBuilderObjectFactory, AbstractRequestService requestBuilder, GenericResponseService responseBuilder, OperationService operationParser, Optional<List<OperationCustomizer>> operationCustomizers, Optional<List<OpenApiCustomiser>> openApiCustomisers, SpringDocConfigProperties springDocConfigProperties, Optional<ActuatorProvider> actuatorProvider) {
90+
super(openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, springDocConfigProperties, actuatorProvider);
9491
}
9592

9693
/**

0 commit comments

Comments
 (0)