Skip to content

Commit 7cfa78d

Browse files
committed
Actuator endpoints have 2 appended to operationId. Fixes springdoc#1421.
1 parent 2f518d8 commit 7cfa78d

File tree

19 files changed

+485
-212
lines changed

19 files changed

+485
-212
lines changed

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

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,11 @@
6363
import org.slf4j.LoggerFactory;
6464
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
6565

66+
import org.springframework.beans.BeansException;
6667
import org.springframework.beans.factory.config.BeanDefinition;
6768
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
6869
import org.springframework.context.ApplicationContext;
70+
import org.springframework.context.ApplicationContextAware;
6971
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
7072
import org.springframework.core.annotation.AnnotatedElementUtils;
7173
import org.springframework.core.annotation.AnnotationUtils;
@@ -86,7 +88,7 @@
8688
* The type Open api builder.
8789
* @author bnasslahsen
8890
*/
89-
public class OpenAPIService {
91+
public class OpenAPIService implements ApplicationContextAware {
9092

9193
/**
9294
* The constant LOGGER.
@@ -96,7 +98,7 @@ public class OpenAPIService {
9698
/**
9799
* The Context.
98100
*/
99-
private final ApplicationContext context;
101+
private ApplicationContext context;
100102

101103
/**
102104
* The Security parser.
@@ -153,6 +155,9 @@ public class OpenAPIService {
153155
*/
154156
private PropertyResolverUtils propertyResolverUtils;
155157

158+
/**
159+
* The Basic error controller.
160+
*/
156161
private static Class<?> basicErrorController;
157162

158163
static {
@@ -176,13 +181,13 @@ public class OpenAPIService {
176181
* Instantiates a new Open api builder.
177182
*
178183
* @param openAPI the open api
179-
* @param context the context
180184
* @param securityParser the security parser
181185
* @param springDocConfigProperties the spring doc config properties
186+
* @param propertyResolverUtils the property resolver utils
182187
* @param openApiBuilderCustomisers the open api builder customisers
183188
*/
184-
OpenAPIService(Optional<OpenAPI> openAPI, ApplicationContext context, SecurityService securityParser,
185-
SpringDocConfigProperties springDocConfigProperties,
189+
OpenAPIService(Optional<OpenAPI> openAPI, SecurityService securityParser,
190+
SpringDocConfigProperties springDocConfigProperties,PropertyResolverUtils propertyResolverUtils,
186191
Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers) {
187192
if (openAPI.isPresent()) {
188193
this.openAPI = openAPI.get();
@@ -193,8 +198,7 @@ public class OpenAPIService {
193198
if (!CollectionUtils.isEmpty(this.openAPI.getServers()))
194199
this.isServersPresent = true;
195200
}
196-
this.context = context;
197-
this.propertyResolverUtils = context.getBean(PropertyResolverUtils.class);
201+
this.propertyResolverUtils=propertyResolverUtils;
198202
this.securityParser = securityParser;
199203
this.springDocConfigProperties = springDocConfigProperties;
200204
this.openApiBuilderCustomisers = openApiBuilderCustomisers;
@@ -261,6 +265,9 @@ else if (calculatedOpenAPI.getInfo() == null) {
261265
openApiBuilderCustomisers.ifPresent(customisers -> customisers.forEach(customiser -> customiser.customise(this)));
262266
}
263267

268+
/**
269+
* Initialize hidden rest controller.
270+
*/
264271
private void initializeHiddenRestController() {
265272
if (basicErrorController != null)
266273
getConfig().addHiddenRestControllers(basicErrorController);
@@ -377,6 +384,13 @@ private void buildTagsFromMethod(Method method, Set<io.swagger.v3.oas.models.tag
377384
}
378385
}
379386

387+
/**
388+
* Add tags.
389+
*
390+
* @param sourceTags the source tags
391+
* @param tags the tags
392+
* @param locale the locale
393+
*/
380394
private void addTags(List<Tag> sourceTags, Set<io.swagger.v3.oas.models.tags.Tag> tags, Locale locale) {
381395
Optional<Set<io.swagger.v3.oas.models.tags.Tag>> optionalTagSet = AnnotationsUtils
382396
.getTags(sourceTags.toArray(new Tag[0]), false);
@@ -573,6 +587,7 @@ private void resolveProperty(Supplier<String> getProperty, Consumer<String> setP
573587
* Calculate security schemes.
574588
*
575589
* @param components the components
590+
* @param locale the locale
576591
*/
577592
private void calculateSecuritySchemes(Components components, Locale locale) {
578593
// Look for SecurityScheme in a spring managed bean
@@ -744,8 +759,8 @@ public OpenAPI getCachedOpenAPI(Locale locale) {
744759
/**
745760
* Sets cached open api.
746761
*
747-
* @param locale associated the the cache entry
748762
* @param cachedOpenAPI the cached open api
763+
* @param locale associated the the cache entry
749764
*/
750765
public void setCachedOpenAPI(OpenAPI cachedOpenAPI, Locale locale) {
751766
this.cachedOpenAPI.put(locale.toLanguageTag(), cachedOpenAPI);
@@ -784,4 +799,9 @@ public ApplicationContext getContext() {
784799
public SecurityService getSecurityParser() {
785800
return securityParser;
786801
}
802+
803+
@Override
804+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
805+
this.context = applicationContext;
806+
}
787807
}

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,10 @@
6060
import org.springdoc.core.providers.RepositoryRestResourceProvider;
6161
import org.springdoc.core.providers.RouterFunctionProvider;
6262
import org.springdoc.core.providers.SecurityOAuth2Provider;
63+
import org.springdoc.core.providers.SpringCloudFunctionProvider;
6364
import org.springdoc.core.providers.SpringDataWebPropertiesProvider;
65+
import org.springdoc.core.providers.SpringWebProvider;
6466
import org.springdoc.core.providers.WebConversionServiceProvider;
65-
import org.springdoc.core.providers.impl.SpringCloudFunctionProvider;
6667

6768
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
6869
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
@@ -78,7 +79,6 @@
7879
import org.springframework.boot.autoconfigure.web.format.WebConversionService;
7980
import org.springframework.cloud.function.context.FunctionCatalog;
8081
import org.springframework.cloud.function.web.function.FunctionEndpointInitializer;
81-
import org.springframework.context.ApplicationContext;
8282
import org.springframework.context.MessageSource;
8383
import org.springframework.context.annotation.Bean;
8484
import org.springframework.context.annotation.Conditional;
@@ -212,19 +212,19 @@ PolymorphicModelConverter polymorphicModelConverter() {
212212
* Open api builder open api builder.
213213
*
214214
* @param openAPI the open api
215-
* @param context the context
216215
* @param securityParser the security parser
217216
* @param springDocConfigProperties the spring doc config properties
217+
* @param propertyResolverUtils the property resolver utils
218218
* @param openApiBuilderCustomisers the open api builder customisers
219219
* @return the open api builder
220220
*/
221221
@Bean
222222
@ConditionalOnMissingBean
223-
OpenAPIService openAPIBuilder(Optional<OpenAPI> openAPI, ApplicationContext context,
223+
OpenAPIService openAPIBuilder(Optional<OpenAPI> openAPI,
224224
SecurityService securityParser,
225-
SpringDocConfigProperties springDocConfigProperties,
225+
SpringDocConfigProperties springDocConfigProperties,PropertyResolverUtils propertyResolverUtils,
226226
Optional<List<OpenApiBuilderCustomizer>> openApiBuilderCustomisers) {
227-
return new OpenAPIService(openAPI, context, securityParser, springDocConfigProperties, openApiBuilderCustomisers);
227+
return new OpenAPIService(openAPI, securityParser, springDocConfigProperties, propertyResolverUtils, openApiBuilderCustomisers);
228228
}
229229

230230
/**
@@ -376,13 +376,15 @@ static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor2() {
376376
* @param springSecurityOAuth2Provider the spring security o auth 2 provider
377377
* @param repositoryRestResourceProvider the repository rest resource provider
378378
* @param routerFunctionProvider the router function provider
379+
* @param springWebProvider the spring web provider
379380
* @return the spring doc providers
380381
*/
381382
@Bean
382383
@ConditionalOnMissingBean
383384
@Lazy(false)
384-
SpringDocProviders springDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider) {
385-
return new SpringDocProviders(actuatorProvider, springCloudFunctionProvider, springSecurityOAuth2Provider, repositoryRestResourceProvider, routerFunctionProvider);
385+
SpringDocProviders springDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider,
386+
Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider, SpringWebProvider springWebProvider) {
387+
return new SpringDocProviders(actuatorProvider, springCloudFunctionProvider, springSecurityOAuth2Provider, repositoryRestResourceProvider, routerFunctionProvider, springWebProvider);
386388
}
387389

388390
/**
@@ -561,14 +563,13 @@ static class SpringDocFunctionCatalogConfiguration {
561563
* @param functionCatalog the function catalog
562564
* @param genericResponseService the generic response service
563565
* @param springDocConfigProperties the spring doc config properties
564-
* @param applicationContext the application context
565566
* @return the spring cloud function provider
566567
*/
567568
@Bean
568569
@ConditionalOnMissingBean
569570
@Lazy(false)
570-
CloudFunctionProvider springCloudFunctionProvider(Optional<FunctionCatalog> functionCatalog, GenericResponseService genericResponseService, SpringDocConfigProperties springDocConfigProperties, ApplicationContext applicationContext) {
571-
return new SpringCloudFunctionProvider(functionCatalog, genericResponseService, springDocConfigProperties, applicationContext);
571+
CloudFunctionProvider springCloudFunctionProvider(Optional<FunctionCatalog> functionCatalog, GenericResponseService genericResponseService, SpringDocConfigProperties springDocConfigProperties) {
572+
return new SpringCloudFunctionProvider(functionCatalog, genericResponseService, springDocConfigProperties);
572573
}
573574
}
574575
}

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springdoc.core.providers.RepositoryRestResourceProvider;
2727
import org.springdoc.core.providers.RouterFunctionProvider;
2828
import org.springdoc.core.providers.SecurityOAuth2Provider;
29+
import org.springdoc.core.providers.SpringWebProvider;
2930

3031
/**
3132
* The type Spring doc providers.
@@ -58,21 +59,27 @@ public class SpringDocProviders {
5859
*/
5960
private final Optional<RouterFunctionProvider> routerFunctionProvider;
6061

62+
/**
63+
* The Spring web provider.
64+
*/
65+
private final SpringWebProvider springWebProvider;
66+
6167
/**
6268
* Instantiates a new Spring doc providers.
63-
*
6469
* @param actuatorProvider the actuator provider
6570
* @param springCloudFunctionProvider the spring cloud function provider
6671
* @param springSecurityOAuth2Provider the spring security o auth 2 provider
6772
* @param repositoryRestResourceProvider the repository rest resource provider
6873
* @param routerFunctionProvider the router function provider
74+
* @param springWebProvider the spring web provider
6975
*/
70-
public SpringDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider) {
76+
public SpringDocProviders(Optional<ActuatorProvider> actuatorProvider, Optional<CloudFunctionProvider> springCloudFunctionProvider, Optional<SecurityOAuth2Provider> springSecurityOAuth2Provider, Optional<RepositoryRestResourceProvider> repositoryRestResourceProvider, Optional<RouterFunctionProvider> routerFunctionProvider, SpringWebProvider springWebProvider) {
7177
this.actuatorProvider = actuatorProvider;
7278
this.springCloudFunctionProvider = springCloudFunctionProvider;
7379
this.springSecurityOAuth2Provider = springSecurityOAuth2Provider;
7480
this.repositoryRestResourceProvider = repositoryRestResourceProvider;
7581
this.routerFunctionProvider = routerFunctionProvider;
82+
this.springWebProvider = springWebProvider;
7683
}
7784

7885
/**
@@ -119,4 +126,13 @@ public Optional<RepositoryRestResourceProvider> getRepositoryRestResourceProvide
119126
public Optional<RouterFunctionProvider> getRouterFunctionProvider() {
120127
return routerFunctionProvider;
121128
}
129+
130+
/**
131+
* Gets spring web provider.
132+
*
133+
* @return the spring web provider
134+
*/
135+
public SpringWebProvider getSpringWebProvider() {
136+
return springWebProvider;
137+
}
122138
}
Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.springdoc.core.providers.impl;
1+
package org.springdoc.core.providers;
22

33
import java.lang.reflect.Type;
44
import java.util.ArrayList;
@@ -23,13 +23,14 @@
2323
import org.springdoc.core.SpringDocConfigProperties;
2424
import org.springdoc.core.annotations.RouterOperations;
2525
import org.springdoc.core.fn.RouterOperation;
26-
import org.springdoc.core.providers.CloudFunctionProvider;
2726

27+
import org.springframework.beans.BeansException;
2828
import org.springframework.beans.factory.annotation.Value;
2929
import org.springframework.cloud.function.context.FunctionCatalog;
3030
import org.springframework.cloud.function.context.catalog.SimpleFunctionRegistry.FunctionInvocationWrapper;
3131
import org.springframework.cloud.function.context.config.RoutingFunction;
3232
import org.springframework.context.ApplicationContext;
33+
import org.springframework.context.ApplicationContextAware;
3334
import org.springframework.http.HttpStatus;
3435
import org.springframework.http.MediaType;
3536
import org.springframework.util.AntPathMatcher;
@@ -43,7 +44,7 @@
4344
* The type Spring cloud function provider.
4445
* @author bnasslahsen
4546
*/
46-
public class SpringCloudFunctionProvider implements CloudFunctionProvider {
47+
public class SpringCloudFunctionProvider implements CloudFunctionProvider, ApplicationContextAware {
4748

4849
/**
4950
* The Function catalog.
@@ -96,13 +97,11 @@ public class SpringCloudFunctionProvider implements CloudFunctionProvider {
9697
* @param functionCatalogOptional the function catalog
9798
* @param genericResponseService the generic response service
9899
* @param springDocConfigProperties the spring doc config properties
99-
* @param applicationContext the application context
100100
*/
101-
public SpringCloudFunctionProvider(Optional<FunctionCatalog> functionCatalogOptional, GenericResponseService genericResponseService, SpringDocConfigProperties springDocConfigProperties, ApplicationContext applicationContext) {
101+
public SpringCloudFunctionProvider(Optional<FunctionCatalog> functionCatalogOptional, GenericResponseService genericResponseService, SpringDocConfigProperties springDocConfigProperties) {
102102
this.functionCatalogOptional = functionCatalogOptional;
103103
this.genericResponseService = genericResponseService;
104104
this.springDocConfigProperties = springDocConfigProperties;
105-
this.applicationContext = applicationContext;
106105
}
107106

108107
@Override
@@ -298,4 +297,9 @@ private void mergeRouterOperation(RouterOperation routerOperation, RouterOperati
298297
routerOperation.setOperation(userRouterOperation.getOperation());
299298
}
300299

300+
@Override
301+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
302+
this.applicationContext = applicationContext;
303+
}
304+
301305
}
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/*
2+
*
3+
* *
4+
* * * Copyright 2019-2022 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+
package org.springdoc.core.providers;
21+
22+
import java.util.Map;
23+
import java.util.Set;
24+
25+
import org.springdoc.core.SpringDocConfigProperties;
26+
27+
import org.springframework.beans.BeansException;
28+
import org.springframework.context.ApplicationContext;
29+
import org.springframework.context.ApplicationContextAware;
30+
31+
/**
32+
* The type Spring web provider.
33+
* @author bnasslahsen
34+
*/
35+
public abstract class SpringWebProvider implements ApplicationContextAware {
36+
37+
/**
38+
* The Application context.
39+
*/
40+
protected ApplicationContext applicationContext;
41+
42+
/**
43+
* The Handler methods.
44+
*/
45+
protected Map handlerMethods;
46+
47+
/**
48+
* Gets handler methods.
49+
*
50+
* @return the handler methods
51+
*/
52+
public abstract Map getHandlerMethods();
53+
54+
/**
55+
* Find path prefix string.
56+
*
57+
* @param springDocConfigProperties the spring doc config properties
58+
* @return the string
59+
*/
60+
public abstract String findPathPrefix(SpringDocConfigProperties springDocConfigProperties);
61+
62+
/**
63+
* Gets active patterns.
64+
*
65+
* @param requestMappingInfo the request mapping info
66+
* @return the active patterns
67+
*/
68+
public abstract Set<String> getActivePatterns(Object requestMappingInfo);
69+
70+
@Override
71+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
72+
this.applicationContext = applicationContext;
73+
}
74+
}

0 commit comments

Comments
 (0)