Skip to content

Commit 3e43d72

Browse files
committed
Exposing swagger-ui on the management port. Fixes #923.
1 parent f5d0ea0 commit 3e43d72

File tree

36 files changed

+643
-232
lines changed

36 files changed

+643
-232
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ public Operation build(HandlerMethod handlerMethod, RequestMethod requestMethod,
237237

238238
for (MethodParameter methodParameter : parameters) {
239239
// check if query param
240-
Parameter parameter = null;
240+
Parameter parameter;
241241
io.swagger.v3.oas.annotations.Parameter parameterDoc = AnnotatedElementUtils.findMergedAnnotation(
242242
AnnotatedElementUtils.forAnnotations(methodParameter.getParameterAnnotations()),
243243
io.swagger.v3.oas.annotations.Parameter.class);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ else if ("application:management".equals(event.getApplicationContext().getId()))
114114
*
115115
* @return the tag
116116
*/
117-
public Tag getTag() {
117+
public static Tag getTag() {
118118
Tag actuatorTag = new Tag();
119119
actuatorTag.setName(Constants.SPRINGDOC_ACTUATOR_TAG);
120120
actuatorTag.setDescription(Constants.SPRINGDOC_ACTUATOR_DESCRIPTION);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ public final class Constants {
318318
/**
319319
* The constant DEFAULT_SWAGGER_UI_ACTUATOR_PATH.
320320
*/
321-
public static final String DEFAULT_SWAGGER_UI_ACTUATOR_PATH= "swagger-ui";
321+
public static final String DEFAULT_SWAGGER_UI_ACTUATOR_PATH= "swaggerui";
322322

323323
/**
324324
* The constant DEFAULT_API_DOCS_ACTUATOR_URL.

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,17 @@
4141
import org.springdoc.core.converters.PropertyCustomizingConverter;
4242
import org.springdoc.core.converters.ResponseSupportConverter;
4343
import org.springdoc.core.converters.SchemaPropertyDeprecatingConverter;
44+
import org.springdoc.core.customizers.ActuatorOpenApiCustomizer;
45+
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
4446
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
4547
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
4648
import org.springdoc.core.customizers.OpenApiCustomiser;
49+
import org.springdoc.core.customizers.OperationCustomizer;
4750
import org.springdoc.core.customizers.PropertyCustomizer;
4851

4952
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
5053
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
54+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
5155
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
5256
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
5357
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
@@ -70,6 +74,7 @@
7074
import static org.springdoc.core.Constants.SPRINGDOC_DEPRECATING_CONVERTER_ENABLED;
7175
import static org.springdoc.core.Constants.SPRINGDOC_ENABLED;
7276
import static org.springdoc.core.Constants.SPRINGDOC_SCHEMA_RESOLVE_PROPERTIES;
77+
import static org.springdoc.core.Constants.SPRINGDOC_SHOW_ACTUATOR;
7378
import static org.springdoc.core.SpringDocUtils.getConfig;
7479

7580
/**
@@ -347,4 +352,35 @@ public ResponseEntity<ErrorMessage> handleNoHandlerFound(OpenApiResourceNotFound
347352
}
348353
}
349354

355+
/**
356+
* The type Spring doc web mvc actuator configuration.
357+
* @author bnasslashen
358+
*/
359+
@ConditionalOnClass(WebEndpointProperties.class)
360+
@ConditionalOnProperty(SPRINGDOC_SHOW_ACTUATOR)
361+
static class SpringDocWebMvcActuatorConfiguration {
362+
363+
/**
364+
* Actuator customizer operation customizer.
365+
*
366+
* @return the operation customizer
367+
*/
368+
@Bean
369+
@Lazy(false)
370+
OperationCustomizer actuatorCustomizer() {
371+
return new ActuatorOperationCustomizer();
372+
}
373+
374+
/**
375+
* Actuator customizer OpenAPI customiser.
376+
*
377+
* @return the OpenAPI customiser
378+
*/
379+
@Bean
380+
@Lazy(false)
381+
OpenApiCustomiser actuatorOpenApiCustomiser(WebEndpointProperties webEndpointProperties) {
382+
return new ActuatorOpenApiCustomizer(webEndpointProperties);
383+
}
384+
385+
}
350386
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import java.util.ArrayList;
2727
import java.util.List;
2828

29+
import org.springdoc.core.customizers.ActuatorOpenApiCustomizer;
30+
import org.springdoc.core.customizers.ActuatorOperationCustomizer;
31+
2932
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3033
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
3134
import org.springframework.boot.context.properties.bind.BindResult;
@@ -69,6 +72,8 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
6972
GroupedOpenApi actuatorGroup = GroupedOpenApi.builder().group(ACTUATOR_DEFAULT_GROUP)
7073
.pathsToMatch(webEndpointProperties.getBasePath() + ALL_PATTERN)
7174
.pathsToExclude(webEndpointProperties.getBasePath() + HEALTH_PATTERN)
75+
.addOperationCustomizer(new ActuatorOperationCustomizer())
76+
.addOpenApiCustomiser(new ActuatorOpenApiCustomizer(webEndpointProperties))
7277
.build();
7378
// Add the actuator group
7479
newGroups.add(actuatorGroup);

springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ActuatorOpenApiCustomizer.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
import io.swagger.v3.oas.models.parameters.Parameter;
1212
import io.swagger.v3.oas.models.parameters.PathParameter;
1313

14+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
1415
import org.springframework.util.CollectionUtils;
1516

17+
import static org.springframework.util.AntPathMatcher.DEFAULT_PATH_SEPARATOR;
18+
1619
/**
1720
* The type Actuator open api customiser.
1821
* @author bnasslahsen
@@ -24,10 +27,16 @@ public class ActuatorOpenApiCustomizer implements OpenApiCustomiser {
2427
*/
2528
private final Pattern pathPathern = Pattern.compile("\\{(.*?)}");
2629

30+
private WebEndpointProperties webEndpointProperties;
31+
32+
public ActuatorOpenApiCustomizer(WebEndpointProperties webEndpointProperties) {
33+
this.webEndpointProperties = webEndpointProperties;
34+
}
35+
2736
@Override
2837
public void customise(OpenAPI openApi) {
2938
openApi.getPaths().entrySet().stream()
30-
.filter(stringPathItemEntry -> stringPathItemEntry.getKey().startsWith("/actuator/"))
39+
.filter(stringPathItemEntry -> stringPathItemEntry.getKey().startsWith(webEndpointProperties.getBasePath()+DEFAULT_PATH_SEPARATOR))
3140
.forEach(stringPathItemEntry -> {
3241
String path = stringPathItemEntry.getKey();
3342
Matcher matcher = pathPathern.matcher(path);

springdoc-openapi-common/src/main/java/org/springdoc/core/customizers/ActuatorOperationCustomizer.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,39 +24,29 @@
2424
package org.springdoc.core.customizers;
2525

2626
import io.swagger.v3.oas.models.Operation;
27-
import org.springdoc.core.ActuatorProvider;
2827

2928
import org.springframework.web.method.HandlerMethod;
3029

30+
import static org.springdoc.core.ActuatorProvider.getTag;
31+
3132
/**
3233
* The type Actuator operation customizer.
3334
* @author bnasslahsen
3435
*/
3536
public class ActuatorOperationCustomizer implements OperationCustomizer {
3637

37-
/**
38-
* The Actuator provider.
39-
*/
40-
private final ActuatorProvider actuatorProvider;
41-
4238
/**
4339
* The Method count.
4440
*/
4541
private int methodCount;
4642

47-
/**
48-
* Instantiates a new Actuator operation customizer.
49-
*
50-
* @param actuatorProvider the actuator provider
51-
*/
52-
public ActuatorOperationCustomizer(ActuatorProvider actuatorProvider) {
53-
this.actuatorProvider = actuatorProvider;
54-
}
5543

5644
@Override
5745
public Operation customize(Operation operation, HandlerMethod handlerMethod) {
58-
if (operation.getTags() != null && operation.getTags().contains(actuatorProvider.getTag().getName())) {
59-
operation.setSummary(handlerMethod.toString());
46+
if (operation.getTags() != null && operation.getTags().contains(getTag().getName())) {
47+
String summary = handlerMethod.toString();
48+
if (!summary.contains("$"))
49+
operation.setSummary(summary);
6050
operation.setOperationId(operation.getOperationId() + "_" + methodCount++);
6151
}
6252
return operation;

springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app13/SpringDocApp13Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ void testIndex() throws Exception {
4848

4949
@Test
5050
public void testIndexActuator() {
51-
String contentAsString = actuatorRestTemplate.getForObject("/application/swagger-ui", String.class);
51+
String contentAsString = actuatorRestTemplate.getForObject("/application/swaggerui", String.class);
5252
assertTrue(contentAsString.contains("Swagger UI"));
5353
}
5454

5555
@Test
5656
public void testIndexSwaggerConfig() throws Exception {
57-
String contentAsString = actuatorRestTemplate.getForObject("/application/swagger-ui/swagger-config", String.class);
57+
String contentAsString = actuatorRestTemplate.getForObject("/application/swaggerui/swagger-config", String.class);
5858
String expected = getContent("results/app13-1.json");
5959
assertEquals(expected, contentAsString, true);
6060
}

springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app14/SpringDocApp14Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ void testIndex() throws Exception {
4848

4949
@Test
5050
public void testIndexActuator() {
51-
String contentAsString = actuatorRestTemplate.getForObject("/application/swagger-ui", String.class);
51+
String contentAsString = actuatorRestTemplate.getForObject("/application/swaggerui", String.class);
5252
assertTrue(contentAsString.contains("Swagger UI"));
5353
}
5454

5555
@Test
5656
public void testIndexSwaggerConfig() throws Exception {
57-
String contentAsString = actuatorRestTemplate.getForObject("/application/swagger-ui/swagger-config", String.class);
57+
String contentAsString = actuatorRestTemplate.getForObject("/application/swaggerui/swagger-config", String.class);
5858
String expected = getContent("results/app14-1.json");
5959
assertEquals(expected, contentAsString, true);
6060
}

springdoc-openapi-ui/src/test/java/test/org/springdoc/ui/app15/SpringDocApp15Test.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ void testIndex() throws Exception {
5151

5252
@Test
5353
public void testIndexActuator() {
54-
String contentAsString = actuatorRestTemplate.getForObject("/test/application/swagger-ui", String.class);
54+
String contentAsString = actuatorRestTemplate.getForObject("/test/application/swaggerui", String.class);
5555
assertTrue(contentAsString.contains("Swagger UI"));
5656
}
5757

5858
@Test
5959
public void testIndexSwaggerConfig() throws Exception {
60-
String contentAsString = actuatorRestTemplate.getForObject("/test/application/swagger-ui/swagger-config", String.class);
60+
String contentAsString = actuatorRestTemplate.getForObject("/test/application/swaggerui/swagger-config", String.class);
6161
String expected = getContent("results/app15-1.json");
6262
assertEquals(expected, contentAsString, true);
6363
}

0 commit comments

Comments
 (0)