Skip to content

Commit 5592430

Browse files
committed
Use Optional List to inject RequestMappingInfoHandlerMapping. Fixes #1282
1 parent 8b53e63 commit 5592430

File tree

12 files changed

+79
-61
lines changed

12 files changed

+79
-61
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/converters/ResponseSupportConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@
3131
import io.swagger.v3.oas.models.media.Schema;
3232
import io.swagger.v3.oas.models.media.StringSchema;
3333

34+
import static org.springdoc.core.converters.ConverterUtils.isFluxTypeWrapper;
3435
import static org.springdoc.core.converters.ConverterUtils.isResponseTypeToIgnore;
3536
import static org.springdoc.core.converters.ConverterUtils.isResponseTypeWrapper;
36-
import static org.springdoc.core.converters.ConverterUtils.isFluxTypeWrapper;
3737

3838
/**
3939
* The type Response support converter.

springdoc-openapi-common/src/test/java/org/springdoc/api/AbstractOpenApiResourceTest.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@
2020

2121
package org.springdoc.api;
2222

23-
import java.util.*;
23+
import java.util.List;
24+
import java.util.Locale;
25+
import java.util.Map;
26+
import java.util.Optional;
2427

2528
import io.swagger.v3.oas.annotations.enums.ParameterIn;
2629
import io.swagger.v3.oas.models.OpenAPI;
@@ -37,7 +40,12 @@
3740
import org.mockito.Mock;
3841
import org.mockito.internal.stubbing.answers.CallsRealMethods;
3942
import org.mockito.junit.jupiter.MockitoExtension;
40-
import org.springdoc.core.*;
43+
import org.springdoc.core.AbstractRequestService;
44+
import org.springdoc.core.ActuatorProvider;
45+
import org.springdoc.core.GenericResponseService;
46+
import org.springdoc.core.OpenAPIService;
47+
import org.springdoc.core.OperationService;
48+
import org.springdoc.core.SpringDocConfigProperties;
4149
import org.springdoc.core.customizers.OpenApiCustomiser;
4250
import org.springdoc.core.customizers.OperationCustomizer;
4351
import org.springdoc.core.fn.RouterOperation;

springdoc-openapi-javadoc/src/test/java/test/org/springdoc/api/app2/model/ModelApiResponse.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
package test.org.springdoc.api.app2.model;
2020

2121
import com.fasterxml.jackson.annotation.JsonProperty;
22-
import io.swagger.v3.oas.annotations.media.Schema;
2322

2423
/**
2524
* The type Model api response.

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package org.springdoc.webmvc.ui;
2222

23+
import java.util.List;
2324
import java.util.Optional;
2425

2526
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -31,7 +32,6 @@
3132
import org.springdoc.core.SwaggerUiConfigProperties;
3233
import org.springdoc.core.SwaggerUiOAuthProperties;
3334

34-
import org.springframework.beans.factory.ObjectProvider;
3535
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
3636
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
3737
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
@@ -60,20 +60,21 @@
6060
@ConditionalOnBean(SpringDocConfiguration.class)
6161
public class SwaggerConfig {
6262

63+
6364
/**
64-
* Swagger welcome swagger welcome.
65+
* Swagger welcome swagger welcome web mvc.
6566
*
6667
* @param swaggerUiConfig the swagger ui config
6768
* @param springDocConfigProperties the spring doc config properties
6869
* @param swaggerUiConfigParameters the swagger ui config parameters
69-
* @param requestMappingInfoHandlerMappingObjectProvider the request mapping info handler mapping object provider
70-
* @return the swagger welcome
70+
* @param requestMappingInfoHandlerMappingOptionalList the request mapping info handler mapping optional list
71+
* @return the swagger welcome web mvc
7172
*/
7273
@Bean
7374
@ConditionalOnMissingBean
7475
@ConditionalOnProperty(name = SPRINGDOC_USE_MANAGEMENT_PORT, havingValue = "false", matchIfMissing = true)
75-
SwaggerWelcomeWebMvc swaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, ObjectProvider<RequestMappingInfoHandlerMapping> requestMappingInfoHandlerMappingObjectProvider) {
76-
return new SwaggerWelcomeWebMvc(swaggerUiConfig, springDocConfigProperties,swaggerUiConfigParameters, requestMappingInfoHandlerMappingObjectProvider);
76+
SwaggerWelcomeWebMvc swaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList) {
77+
return new SwaggerWelcomeWebMvc(swaggerUiConfig, springDocConfigProperties,swaggerUiConfigParameters, requestMappingInfoHandlerMappingOptionalList);
7778
}
7879

7980
/**

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

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Map.Entry;
27+
import java.util.Optional;
2728
import java.util.Set;
2829

2930
import javax.annotation.PostConstruct;
@@ -36,7 +37,6 @@
3637
import org.springdoc.core.SwaggerUiConfigProperties;
3738
import org.springdoc.webmvc.api.OpenApiResource;
3839

39-
import org.springframework.beans.factory.ObjectProvider;
4040
import org.springframework.beans.factory.annotation.Value;
4141
import org.springframework.http.ResponseEntity;
4242
import org.springframework.stereotype.Controller;
@@ -73,40 +73,44 @@ public class SwaggerWelcomeWebMvc extends SwaggerWelcomeCommon {
7373
/**
7474
* The Request mapping handler mapping.
7575
*/
76-
private final ObjectProvider<RequestMappingInfoHandlerMapping> requestMappingInfoHandlerMappingObjectProvider;
76+
private final Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList;
77+
7778

7879
/**
79-
* Instantiates a new Swagger welcome.
80+
* Instantiates a new Swagger welcome web mvc.
8081
*
8182
* @param swaggerUiConfig the swagger ui config
8283
* @param springDocConfigProperties the spring doc config properties
8384
* @param swaggerUiConfigParameters the swagger ui config parameters
84-
* @param requestMappingInfoHandlerMappingObjectProvider the request mapping info handler mapping object provider
85+
* @param requestMappingInfoHandlerMappingOptionalList the request mapping info handler mapping optional list
8586
*/
86-
public SwaggerWelcomeWebMvc(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties,SwaggerUiConfigParameters swaggerUiConfigParameters, ObjectProvider<RequestMappingInfoHandlerMapping> requestMappingInfoHandlerMappingObjectProvider) {
87+
public SwaggerWelcomeWebMvc(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties, SwaggerUiConfigParameters swaggerUiConfigParameters, Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList) {
8788
super(swaggerUiConfig, springDocConfigProperties, swaggerUiConfigParameters);
88-
this.requestMappingInfoHandlerMappingObjectProvider = requestMappingInfoHandlerMappingObjectProvider;
89+
this.requestMappingInfoHandlerMappingOptionalList = requestMappingInfoHandlerMappingOptionalList;
8990
}
9091

9192
/**
9293
* Init.
9394
*/
9495
@PostConstruct
9596
private void init() {
96-
requestMappingInfoHandlerMappingObjectProvider.orderedStream().forEach(requestMappingHandlerMapping -> {
97-
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
98-
List<Entry<RequestMappingInfo, HandlerMethod>> entries = new ArrayList<>(map.entrySet());
99-
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
100-
RequestMappingInfo requestMappingInfo = entry.getKey();
101-
Set<String> patterns = OpenApiResource.getActivePatterns(requestMappingInfo);
102-
if (!CollectionUtils.isEmpty(patterns)) {
103-
for (String operationPath : patterns) {
104-
if (operationPath.endsWith(springDocConfigProperties.getApiDocs().getPath()))
105-
pathPrefix = operationPath.replace(springDocConfigProperties.getApiDocs().getPath(), StringUtils.EMPTY);
106-
}
107-
}
108-
}
109-
});
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+
));
110114
}
111115

112116
/**
@@ -166,6 +170,6 @@ protected String buildApiDocUrl() {
166170
*/
167171
@Override
168172
protected String buildSwaggerConfigUrl() {
169-
return apiDocsUrl + DEFAULT_PATH_SEPARATOR + SWAGGGER_CONFIG_FILE;
173+
return apiDocsUrl + DEFAULT_PATH_SEPARATOR + SWAGGGER_CONFIG_FILE;
170174
}
171-
}
175+
}

springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app152/HelloController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@
2020

2121
import org.reactivestreams.Publisher;
2222
import org.springdoc.core.GroupedOpenApi;
23+
import reactor.core.publisher.Mono;
24+
2325
import org.springframework.context.annotation.Bean;
2426
import org.springframework.web.bind.annotation.GetMapping;
2527
import org.springframework.web.bind.annotation.RestController;
26-
import reactor.core.publisher.Mono;
2728

2829
@RestController
2930
public class HelloController {

springdoc-openapi-webflux-core/src/test/java/test/org/springdoc/api/app152/SpringDocApp152Test.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@
2020

2121
package test.org.springdoc.api.app152;
2222

23+
import test.org.springdoc.api.AbstractSpringDocTest;
24+
2325
import org.springframework.boot.autoconfigure.SpringBootApplication;
2426
import org.springframework.context.annotation.ComponentScan;
25-
import test.org.springdoc.api.AbstractSpringDocTest;
2627

2728
public class SpringDocApp152Test extends AbstractSpringDocTest {
2829

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
package org.springdoc.webflux.ui;
2222

23+
import java.util.List;
2324
import java.util.Optional;
2425

2526
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -31,7 +32,6 @@
3132
import org.springdoc.core.SwaggerUiConfigProperties;
3233
import org.springdoc.core.SwaggerUiOAuthProperties;
3334

34-
import org.springframework.beans.factory.ObjectProvider;
3535
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
3636
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
3737
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
@@ -68,14 +68,14 @@ public class SwaggerConfig implements WebFluxConfigurer {
6868
* @param swaggerUiConfig the swagger ui config
6969
* @param springDocConfigProperties the spring doc config properties
7070
* @param swaggerUiConfigParameters the swagger ui config parameters
71-
* @param requestMappingInfoHandlerMappingObjectProvider the request mapping handler mapping object provider
71+
* @param requestMappingInfoHandlerMappingOptionalList the request mapping info handler mapping optional list
7272
* @return the swagger welcome web flux
7373
*/
7474
@Bean
7575
@ConditionalOnMissingBean
7676
@ConditionalOnProperty(name = SPRINGDOC_USE_MANAGEMENT_PORT, havingValue = "false", matchIfMissing = true)
77-
SwaggerWelcomeWebFlux swaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties,SwaggerUiConfigParameters swaggerUiConfigParameters, ObjectProvider<RequestMappingInfoHandlerMapping> requestMappingInfoHandlerMappingObjectProvider) {
78-
return new SwaggerWelcomeWebFlux(swaggerUiConfig,springDocConfigProperties,swaggerUiConfigParameters,requestMappingInfoHandlerMappingObjectProvider);
77+
SwaggerWelcomeWebFlux swaggerWelcome(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties,SwaggerUiConfigParameters swaggerUiConfigParameters, Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList) {
78+
return new SwaggerWelcomeWebFlux(swaggerUiConfig,springDocConfigProperties,swaggerUiConfigParameters,requestMappingInfoHandlerMappingOptionalList);
7979
}
8080

8181
/**

springdoc-openapi-webflux-ui/src/main/java/org/springdoc/webflux/ui/SwaggerWelcomeWebFlux.java

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.util.List;
2525
import java.util.Map;
2626
import java.util.Map.Entry;
27+
import java.util.Optional;
2728
import java.util.Set;
2829

2930
import javax.annotation.PostConstruct;
@@ -35,7 +36,6 @@
3536
import org.springdoc.core.SwaggerUiConfigProperties;
3637
import reactor.core.publisher.Mono;
3738

38-
import org.springframework.beans.factory.ObjectProvider;
3939
import org.springframework.http.server.reactive.ServerHttpRequest;
4040
import org.springframework.http.server.reactive.ServerHttpResponse;
4141
import org.springframework.stereotype.Controller;
@@ -61,46 +61,48 @@ public class SwaggerWelcomeWebFlux extends SwaggerWelcomeCommon {
6161
/**
6262
* The Request mapping handler mapping.
6363
*/
64-
private final ObjectProvider<RequestMappingInfoHandlerMapping> requestMappingInfoHandlerMappingObjectProvider;
64+
private final Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList;
6565

6666
/**
6767
* The Path prefix.
6868
*/
6969
private String pathPrefix;
7070

71+
7172
/**
72-
* Instantiates a new Swagger welcome.
73+
* Instantiates a new Swagger welcome web flux.
7374
*
7475
* @param swaggerUiConfig the swagger ui config
7576
* @param springDocConfigProperties the spring doc config properties
7677
* @param swaggerUiConfigParameters the swagger ui config parameters
77-
* @param requestMappingInfoHandlerMappingObjectProvider the request mapping handler mapping object provider
78+
* @param requestMappingInfoHandlerMappingOptionalList the request mapping info handler mapping optional list
7879
*/
7980
public SwaggerWelcomeWebFlux(SwaggerUiConfigProperties swaggerUiConfig, SpringDocConfigProperties springDocConfigProperties,
80-
SwaggerUiConfigParameters swaggerUiConfigParameters, ObjectProvider<RequestMappingInfoHandlerMapping> requestMappingInfoHandlerMappingObjectProvider) {
81+
SwaggerUiConfigParameters swaggerUiConfigParameters, Optional<List<RequestMappingInfoHandlerMapping>> requestMappingInfoHandlerMappingOptionalList) {
8182
super(swaggerUiConfig, springDocConfigProperties, swaggerUiConfigParameters);
82-
this.requestMappingInfoHandlerMappingObjectProvider = requestMappingInfoHandlerMappingObjectProvider;
83+
this.requestMappingInfoHandlerMappingOptionalList = requestMappingInfoHandlerMappingOptionalList;
8384
}
8485

8586
/**
8687
* Init.
8788
*/
8889
@PostConstruct
8990
private void init() {
90-
requestMappingInfoHandlerMappingObjectProvider.orderedStream().forEach(requestMappingHandlerMapping -> {
91-
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
92-
List<Entry<RequestMappingInfo, HandlerMethod>> entries = new ArrayList<>(map.entrySet());
93-
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
94-
RequestMappingInfo requestMappingInfo = entry.getKey();
95-
PatternsRequestCondition patternsRequestCondition = requestMappingInfo.getPatternsCondition();
96-
Set<PathPattern> patterns = patternsRequestCondition.getPatterns();
97-
for (PathPattern pathPattern : patterns) {
98-
String operationPath = pathPattern.getPatternString();
99-
if (operationPath.endsWith(springDocConfigProperties.getApiDocs().getPath()))
100-
pathPrefix = operationPath.replace(springDocConfigProperties.getApiDocs().getPath(), StringUtils.EMPTY);
101-
}
102-
}
103-
});
91+
requestMappingInfoHandlerMappingOptionalList.ifPresent(requestMappingInfoHandlerMappingList ->
92+
requestMappingInfoHandlerMappingList.forEach(requestMappingHandlerMapping -> {
93+
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();
94+
List<Entry<RequestMappingInfo, HandlerMethod>> entries = new ArrayList<>(map.entrySet());
95+
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
96+
RequestMappingInfo requestMappingInfo = entry.getKey();
97+
PatternsRequestCondition patternsRequestCondition = requestMappingInfo.getPatternsCondition();
98+
Set<PathPattern> patterns = patternsRequestCondition.getPatterns();
99+
for (PathPattern pathPattern : patterns) {
100+
String operationPath = pathPattern.getPatternString();
101+
if (operationPath.endsWith(springDocConfigProperties.getApiDocs().getPath()))
102+
pathPrefix = operationPath.replace(springDocConfigProperties.getApiDocs().getPath(), StringUtils.EMPTY);
103+
}
104+
}
105+
}));
104106
}
105107

106108
/**
@@ -125,7 +127,7 @@ protected void calculateUiRootPath(StringBuilder... sbUrls) {
125127

126128
@Override
127129
protected void calculateOauth2RedirectUrl(UriComponentsBuilder uriComponentsBuilder) {
128-
if ((oauthPrefix == null && !swaggerUiConfigParameters.isValidUrl(swaggerUiConfigParameters.getOauth2RedirectUrl())) || springDocConfigProperties.isCacheDisabled()) {
130+
if ((oauthPrefix == null && !swaggerUiConfigParameters.isValidUrl(swaggerUiConfigParameters.getOauth2RedirectUrl())) || springDocConfigProperties.isCacheDisabled()) {
129131
this.oauthPrefix = uriComponentsBuilder.path(contextPath).path(swaggerUiConfigParameters.getUiRootPath()).path(webJarsPrefixUrl);
130132
swaggerUiConfigParameters.setOauth2RedirectUrl(this.oauthPrefix.path(getOauth2RedirectUrl()).build().toString());
131133
}

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app157/StringyConverter.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package test.org.springdoc.api.app157;
22

3+
import java.util.Iterator;
4+
35
import com.fasterxml.jackson.databind.JavaType;
46
import io.swagger.v3.core.converter.AnnotatedType;
57
import io.swagger.v3.core.converter.ModelConverter;
68
import io.swagger.v3.core.converter.ModelConverterContext;
79
import io.swagger.v3.core.util.Json;
810
import io.swagger.v3.oas.models.media.Schema;
911

10-
import java.util.Iterator;
11-
1212
public class StringyConverter implements ModelConverter {
1313

1414
@Override

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app158/HelloController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
2222
import io.swagger.v3.oas.annotations.info.Info;
2323
import io.swagger.v3.oas.annotations.tags.Tag;
24+
2425
import org.springframework.web.bind.annotation.GetMapping;
2526
import org.springframework.web.bind.annotation.RequestMapping;
2627
import org.springframework.web.bind.annotation.RestController;

springdoc-openapi-webmvc-core/src/test/java/test/org/springdoc/api/app159/HelloController.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
44
import io.swagger.v3.oas.annotations.info.Info;
55
import io.swagger.v3.oas.annotations.tags.Tag;
6+
67
import org.springframework.web.bind.annotation.PostMapping;
78
import org.springframework.web.bind.annotation.RequestBody;
89
import org.springframework.web.bind.annotation.RequestMapping;

0 commit comments

Comments
 (0)