Skip to content

Commit 34f6710

Browse files
committed
Upgrade from Springdoc 1.6.3 to 1.6.4 causes issues if springdoc-openapi-common is on the classpath but springdoc-openapi-ui is not. Fixes #1446
1 parent 9c96abe commit 34f6710

File tree

6 files changed

+98
-84
lines changed

6 files changed

+98
-84
lines changed

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor2() {
383383
@ConditionalOnMissingBean
384384
@Lazy(false)
385385
SpringDocProviders springDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
386-
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider, SpringWebProvider springWebProvider) {
386+
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider, Optional<SpringWebProvider> springWebProvider) {
387387
return new SpringDocProviders(actuatorProvider, springCloudFunctionProvider, springSecurityOAuth2Provider, repositoryRestResourceProvider, routerFunctionProvider, springWebProvider);
388388
}
389389

springdoc-openapi-common/src/main/java/org/springdoc/core/SpringDocProviders.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public class SpringDocProviders {
6262
/**
6363
* The Spring web provider.
6464
*/
65-
private final SpringWebProvider springWebProvider;
65+
private final Optional<SpringWebProvider> springWebProvider;
6666

6767
/**
6868
* Instantiates a new Spring doc providers.
@@ -73,7 +73,9 @@ public class SpringDocProviders {
7373
* @param routerFunctionProvider the router function provider
7474
* @param springWebProvider the spring web provider
7575
*/
76-
public SpringDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider, SpringWebProvider springWebProvider) {
76+
public SpringDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider,
77+
Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider,
78+
Optional<RouterFunctionProvider> routerFunctionProvider, Optional<SpringWebProvider> springWebProvider) {
7779
this.actuatorProvider = actuatorProvider;
7880
this.springCloudFunctionProvider = springCloudFunctionProvider;
7981
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
@@ -132,7 +134,7 @@ public Optional<RouterFunctionProvider> getRouterFunctionProvider() {
132134
*
133135
* @return the spring web provider
134136
*/
135-
public SpringWebProvider getSpringWebProvider() {
137+
public Optional<SpringWebProvider> getSpringWebProvider() {
136138
return springWebProvider;
137139
}
138140
}

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

Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@
3737
import org.springdoc.api.AbstractOpenApiResource;
3838
import org.springdoc.core.AbstractRequestService;
3939
import org.springdoc.core.GenericResponseService;
40-
import org.springdoc.core.filters.OpenApiMethodFilter;
4140
import org.springdoc.core.OpenAPIService;
4241
import org.springdoc.core.OperationService;
4342
import org.springdoc.core.SpringDocConfigProperties;
4443
import org.springdoc.core.SpringDocProviders;
4544
import org.springdoc.core.customizers.OpenApiCustomiser;
4645
import org.springdoc.core.customizers.OperationCustomizer;
46+
import org.springdoc.core.filters.OpenApiMethodFilter;
4747
import org.springdoc.core.providers.ActuatorProvider;
4848
import org.springdoc.core.providers.SpringWebProvider;
4949
import org.springdoc.webflux.core.visitor.RouterFunctionVisitor;
@@ -155,16 +155,18 @@ protected Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest, String a
155155
@Override
156156
@SuppressWarnings("unchecked")
157157
protected void getPaths(Map<String, Object> restControllers, Locale locale) {
158-
SpringWebProvider springWebProvider = springDocProviders.getSpringWebProvider();
159-
Map<RequestMappingInfo, HandlerMethod> map = springWebProvider.getHandlerMethods();
160-
calculatePath(restControllers, map, locale);
161-
Optional<ActuatorProvider> actuatorProviderOptional = springDocProviders.getActuatorProvider();
162-
if (actuatorProviderOptional.isPresent() && springDocConfigProperties.isShowActuator()) {
163-
map = actuatorProviderOptional.get().getMethods();
164-
this.openAPIService.addTag(new HashSet<>(map.values()), getTag());
158+
Optional<SpringWebProvider> springWebProviderOptional = springDocProviders.getSpringWebProvider();
159+
springWebProviderOptional.ifPresent(springWebProvider -> {
160+
Map<RequestMappingInfo, HandlerMethod> map = springWebProvider.getHandlerMethods();
165161
calculatePath(restControllers, map, locale);
166-
}
167-
getWebFluxRouterFunctionPaths(locale);
162+
Optional<ActuatorProvider> actuatorProviderOptional = springDocProviders.getActuatorProvider();
163+
if (actuatorProviderOptional.isPresent() && springDocConfigProperties.isShowActuator()) {
164+
map = actuatorProviderOptional.get().getMethods();
165+
this.openAPIService.addTag(new HashSet<>(map.values()), getTag());
166+
calculatePath(restControllers, map, locale);
167+
}
168+
getWebFluxRouterFunctionPaths(locale);
169+
});
168170
}
169171

170172
/**
@@ -177,27 +179,29 @@ protected void getPaths(Map<String, Object> restControllers, Locale locale) {
177179
protected void calculatePath(Map<String, Object> restControllers, Map<RequestMappingInfo, HandlerMethod> map, Locale locale) {
178180
List<Map.Entry<RequestMappingInfo, HandlerMethod>> entries = new ArrayList<>(map.entrySet());
179181
entries.sort(byReversedRequestMappingInfos());
180-
SpringWebProvider springWebProvider = springDocProviders.getSpringWebProvider();
181-
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
182-
RequestMappingInfo requestMappingInfo = entry.getKey();
183-
HandlerMethod handlerMethod = entry.getValue();
184-
Set<String> patterns = springWebProvider.getActivePatterns(requestMappingInfo);
185-
for (String operationPath : patterns) {
186-
Map<String, String> regexMap = new LinkedHashMap<>();
187-
operationPath = PathUtils.parsePath(operationPath, regexMap);
188-
String[] produces = requestMappingInfo.getProducesCondition().getProducibleMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
189-
String[] consumes = requestMappingInfo.getConsumesCondition().getConsumableMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
190-
String[] headers = requestMappingInfo.getHeadersCondition().getExpressions().stream().map(Object::toString).toArray(String[]::new);
191-
if ((isRestController(restControllers, handlerMethod, operationPath) || isActuatorRestController(operationPath, handlerMethod))
192-
&& isFilterCondition(handlerMethod, operationPath, produces, consumes, headers)) {
193-
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
194-
// default allowed requestmethods
195-
if (requestMethods.isEmpty())
196-
requestMethods = this.getDefaultAllowedHttpMethods();
197-
calculatePath(handlerMethod, operationPath, requestMethods, locale);
182+
Optional<SpringWebProvider> springWebProviderOptional = springDocProviders.getSpringWebProvider();
183+
springWebProviderOptional.ifPresent(springWebProvider -> {
184+
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
185+
RequestMappingInfo requestMappingInfo = entry.getKey();
186+
HandlerMethod handlerMethod = entry.getValue();
187+
Set<String> patterns = springWebProvider.getActivePatterns(requestMappingInfo);
188+
for (String operationPath : patterns) {
189+
Map<String, String> regexMap = new LinkedHashMap<>();
190+
operationPath = PathUtils.parsePath(operationPath, regexMap);
191+
String[] produces = requestMappingInfo.getProducesCondition().getProducibleMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
192+
String[] consumes = requestMappingInfo.getConsumesCondition().getConsumableMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
193+
String[] headers = requestMappingInfo.getHeadersCondition().getExpressions().stream().map(Object::toString).toArray(String[]::new);
194+
if ((isRestController(restControllers, handlerMethod, operationPath) || isActuatorRestController(operationPath, handlerMethod))
195+
&& isFilterCondition(handlerMethod, operationPath, produces, consumes, headers)) {
196+
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
197+
// default allowed requestmethods
198+
if (requestMethods.isEmpty())
199+
requestMethods = this.getDefaultAllowedHttpMethods();
200+
calculatePath(handlerMethod, operationPath, requestMethods, locale);
201+
}
198202
}
199203
}
200-
}
204+
});
201205
}
202206

203207
/**

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,16 @@
2626

2727
import com.fasterxml.jackson.core.JsonProcessingException;
2828
import io.swagger.v3.oas.annotations.Operation;
29+
import org.apache.commons.lang3.StringUtils;
2930
import org.springdoc.core.AbstractRequestService;
3031
import org.springdoc.core.GenericResponseService;
31-
import org.springdoc.core.filters.OpenApiMethodFilter;
3232
import org.springdoc.core.OpenAPIService;
3333
import org.springdoc.core.OperationService;
3434
import org.springdoc.core.SpringDocConfigProperties;
3535
import org.springdoc.core.SpringDocProviders;
3636
import org.springdoc.core.customizers.OpenApiCustomiser;
3737
import org.springdoc.core.customizers.OperationCustomizer;
38+
import org.springdoc.core.filters.OpenApiMethodFilter;
3839
import org.springdoc.core.providers.SpringWebProvider;
3940
import reactor.core.publisher.Mono;
4041

@@ -138,9 +139,11 @@ public Mono<String> openapiYaml(ServerHttpRequest serverHttpRequest,
138139
@Override
139140
protected String getServerUrl(ServerHttpRequest serverHttpRequest, String apiDocsUrl) {
140141
String requestUrl = decode(serverHttpRequest.getURI().toString());
141-
SpringWebProvider springWebProvider = springDocProviders.getSpringWebProvider();
142-
String prefix = springWebProvider.findPathPrefix(springDocConfigProperties);
143-
return requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length()- prefix.length());
142+
Optional<SpringWebProvider> springWebProviderOptional = springDocProviders.getSpringWebProvider();
143+
String prefix = StringUtils.EMPTY;
144+
if(springWebProviderOptional.isPresent())
145+
prefix = springWebProviderOptional.get().findPathPrefix(springDocConfigProperties);
146+
return requestUrl.substring(0, requestUrl.length() - apiDocsUrl.length()- prefix.length());
144147
}
145148

146149
}

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

Lines changed: 45 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,13 @@
3939
import org.springdoc.api.AbstractOpenApiResource;
4040
import org.springdoc.core.AbstractRequestService;
4141
import org.springdoc.core.GenericResponseService;
42-
import org.springdoc.core.filters.OpenApiMethodFilter;
4342
import org.springdoc.core.OpenAPIService;
4443
import org.springdoc.core.OperationService;
4544
import org.springdoc.core.SpringDocConfigProperties;
4645
import org.springdoc.core.SpringDocProviders;
4746
import org.springdoc.core.customizers.OpenApiCustomiser;
4847
import org.springdoc.core.customizers.OperationCustomizer;
48+
import org.springdoc.core.filters.OpenApiMethodFilter;
4949
import org.springdoc.core.fn.RouterOperation;
5050
import org.springdoc.core.providers.ActuatorProvider;
5151
import org.springdoc.core.providers.RepositoryRestResourceProvider;
@@ -89,7 +89,7 @@ public OpenApiResource(String groupName, ObjectFactory<OpenAPIService> openAPIBu
8989
Optional<List<OpenApiMethodFilter>> methodFilters,
9090
SpringDocConfigProperties springDocConfigProperties,
9191
SpringDocProviders springDocProviders) {
92-
super(groupName, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers,methodFilters, springDocConfigProperties, springDocProviders);
92+
super(groupName, openAPIBuilderObjectFactory, requestBuilder, responseBuilder, operationParser, operationCustomizers, openApiCustomisers, methodFilters, springDocConfigProperties, springDocProviders);
9393
}
9494

9595
/**
@@ -152,30 +152,30 @@ public String openapiYaml(HttpServletRequest request,
152152
@Override
153153
@SuppressWarnings("unchecked")
154154
protected void getPaths(Map<String, Object> restControllers, Locale locale) {
155-
SpringWebProvider springWebProvider = springDocProviders.getSpringWebProvider();
156-
Map<RequestMappingInfo, HandlerMethod> map = springWebProvider.getHandlerMethods();
155+
Optional<SpringWebProvider> springWebProviderOptional = springDocProviders.getSpringWebProvider();
156+
springWebProviderOptional.ifPresent(springWebProvider -> {
157+
Map<RequestMappingInfo, HandlerMethod> map = springWebProvider.getHandlerMethods();
157158

158-
Optional<RepositoryRestResourceProvider> repositoryRestResourceProviderOptional = springDocProviders.getRepositoryRestResourceProvider();
159-
repositoryRestResourceProviderOptional.ifPresent(restResourceProvider -> {
160-
List<RouterOperation> operationList = restResourceProvider.getRouterOperations(openAPIService.getCalculatedOpenAPI(), locale);
161-
calculatePath(operationList, locale);
162-
restResourceProvider.customize(openAPIService.getCalculatedOpenAPI());
163-
Map<RequestMappingInfo, HandlerMethod> mapDataRest = restResourceProvider.getHandlerMethods();
164-
Map<String, Object> requestMappingMap = restResourceProvider.getBasePathAwareControllerEndpoints();
165-
Class[] additionalRestClasses = requestMappingMap.values().stream().map(Object::getClass).toArray(Class[]::new);
166-
AbstractOpenApiResource.addRestControllers(additionalRestClasses);
167-
calculatePath(requestMappingMap, mapDataRest, locale);
168-
});
159+
Optional<RepositoryRestResourceProvider> repositoryRestResourceProviderOptional = springDocProviders.getRepositoryRestResourceProvider();
160+
repositoryRestResourceProviderOptional.ifPresent(restResourceProvider -> {
161+
List<RouterOperation> operationList = restResourceProvider.getRouterOperations(openAPIService.getCalculatedOpenAPI(), locale);
162+
calculatePath(operationList, locale);
163+
restResourceProvider.customize(openAPIService.getCalculatedOpenAPI());
164+
Map<RequestMappingInfo, HandlerMethod> mapDataRest = restResourceProvider.getHandlerMethods();
165+
Map<String, Object> requestMappingMap = restResourceProvider.getBasePathAwareControllerEndpoints();
166+
Class[] additionalRestClasses = requestMappingMap.values().stream().map(Object::getClass).toArray(Class[]::new);
167+
AbstractOpenApiResource.addRestControllers(additionalRestClasses);
168+
calculatePath(requestMappingMap, mapDataRest, locale);
169+
});
169170

170-
calculatePath(restControllers, map, locale);
171-
Optional<ActuatorProvider> actuatorProviderOptional = springDocProviders.getActuatorProvider();
172-
if (actuatorProviderOptional.isPresent() && springDocConfigProperties.isShowActuator()) {
173-
map = actuatorProviderOptional.get().getMethods();
174-
this.openAPIService.addTag(new HashSet<>(map.values()), getTag());
175171
calculatePath(restControllers, map, locale);
176-
}
177-
178-
172+
Optional<ActuatorProvider> actuatorProviderOptional = springDocProviders.getActuatorProvider();
173+
if (actuatorProviderOptional.isPresent() && springDocConfigProperties.isShowActuator()) {
174+
map = actuatorProviderOptional.get().getMethods();
175+
this.openAPIService.addTag(new HashSet<>(map.values()), getTag());
176+
calculatePath(restControllers, map, locale);
177+
}
178+
});
179179

180180
Optional<SecurityOAuth2Provider> securityOAuth2ProviderOptional = springDocProviders.getSpringSecurityOAuth2Provider();
181181
if (securityOAuth2ProviderOptional.isPresent()) {
@@ -202,29 +202,31 @@ protected void getPaths(Map<String, Object> restControllers, Locale locale) {
202202
protected void calculatePath(Map<String, Object> restControllers, Map<RequestMappingInfo, HandlerMethod> map, Locale locale) {
203203
List<Map.Entry<RequestMappingInfo, HandlerMethod>> entries = new ArrayList<>(map.entrySet());
204204
entries.sort(byReversedRequestMappingInfos());
205-
SpringWebProvider springWebProvider = springDocProviders.getSpringWebProvider();
206-
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
207-
RequestMappingInfo requestMappingInfo = entry.getKey();
208-
HandlerMethod handlerMethod = entry.getValue();
209-
Set<String> patterns = springWebProvider.getActivePatterns(requestMappingInfo);
210-
if (!CollectionUtils.isEmpty(patterns)) {
211-
Map<String, String> regexMap = new LinkedHashMap<>();
212-
for (String pattern : patterns) {
213-
String operationPath = PathUtils.parsePath(pattern, regexMap);
214-
String[] produces = requestMappingInfo.getProducesCondition().getProducibleMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
215-
String[] consumes = requestMappingInfo.getConsumesCondition().getConsumableMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
216-
String[] headers = requestMappingInfo.getHeadersCondition().getExpressions().stream().map(Object::toString).toArray(String[]::new);
217-
if ((isRestController(restControllers, handlerMethod, operationPath) || isActuatorRestController(operationPath, handlerMethod))
218-
&& isFilterCondition(handlerMethod, operationPath, produces, consumes, headers)) {
219-
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
220-
// default allowed requestmethods
221-
if (requestMethods.isEmpty())
222-
requestMethods = this.getDefaultAllowedHttpMethods();
223-
calculatePath(handlerMethod, operationPath, requestMethods, locale);
205+
Optional<SpringWebProvider> springWebProviderOptional = springDocProviders.getSpringWebProvider();
206+
springWebProviderOptional.ifPresent(springWebProvider -> {
207+
for (Map.Entry<RequestMappingInfo, HandlerMethod> entry : entries) {
208+
RequestMappingInfo requestMappingInfo = entry.getKey();
209+
HandlerMethod handlerMethod = entry.getValue();
210+
Set<String> patterns = springWebProvider.getActivePatterns(requestMappingInfo);
211+
if (!CollectionUtils.isEmpty(patterns)) {
212+
Map<String, String> regexMap = new LinkedHashMap<>();
213+
for (String pattern : patterns) {
214+
String operationPath = PathUtils.parsePath(pattern, regexMap);
215+
String[] produces = requestMappingInfo.getProducesCondition().getProducibleMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
216+
String[] consumes = requestMappingInfo.getConsumesCondition().getConsumableMediaTypes().stream().map(MimeType::toString).toArray(String[]::new);
217+
String[] headers = requestMappingInfo.getHeadersCondition().getExpressions().stream().map(Object::toString).toArray(String[]::new);
218+
if ((isRestController(restControllers, handlerMethod, operationPath) || isActuatorRestController(operationPath, handlerMethod))
219+
&& isFilterCondition(handlerMethod, operationPath, produces, consumes, headers)) {
220+
Set<RequestMethod> requestMethods = requestMappingInfo.getMethodsCondition().getMethods();
221+
// default allowed requestmethods
222+
if (requestMethods.isEmpty())
223+
requestMethods = this.getDefaultAllowedHttpMethods();
224+
calculatePath(handlerMethod, operationPath, requestMethods, locale);
225+
}
224226
}
225227
}
226228
}
227-
}
229+
});
228230
}
229231

230232

0 commit comments

Comments
 (0)