Skip to content

Commit fd63c28

Browse files
committed
Ease group declaration through code or properties with actuators
(Global actuator customizers)
1 parent c523445 commit fd63c28

File tree

8 files changed

+1905
-8
lines changed

8 files changed

+1905
-8
lines changed

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,8 @@
5252
import org.springdoc.core.customizers.DataRestDelegatingMethodParameterCustomizer;
5353
import org.springdoc.core.customizers.DelegatingMethodParameterCustomizer;
5454
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
55+
import org.springdoc.core.customizers.GlobalOperationCustomizer;
5556
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
56-
import org.springdoc.core.customizers.OpenApiCustomiser;
57-
import org.springdoc.core.customizers.OperationCustomizer;
5857
import org.springdoc.core.customizers.PropertyCustomizer;
5958
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
6059
import org.springdoc.core.providers.ActuatorProvider;
@@ -462,7 +461,7 @@ static BeanFactoryPostProcessor springdocBeanFactoryPostProcessor3(List<GroupedO
462461
@Bean
463462
@Lazy(false)
464463
@ConditionalOnManagementPort(ManagementPortType.SAME)
465-
OperationCustomizer actuatorCustomizer() {
464+
GlobalOperationCustomizer actuatorCustomizer() {
466465
return new ActuatorOperationCustomizer();
467466
}
468467

@@ -475,7 +474,7 @@ OperationCustomizer actuatorCustomizer() {
475474
@Bean
476475
@Lazy(false)
477476
@ConditionalOnManagementPort(ManagementPortType.SAME)
478-
OpenApiCustomiser actuatorOpenApiCustomiser(WebEndpointProperties webEndpointProperties) {
477+
GlobalOpenApiCustomizer actuatorOpenApiCustomiser(WebEndpointProperties webEndpointProperties) {
479478
return new ActuatorOpenApiCustomizer(webEndpointProperties);
480479
}
481480

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

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,6 @@ public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
7777
GroupedOpenApi actuatorGroup = GroupedOpenApi.builder().group(ACTUATOR_DEFAULT_GROUP)
7878
.pathsToMatch(webEndpointProperties.getBasePath() + ALL_PATTERN)
7979
.pathsToExclude(webEndpointProperties.getBasePath() + HEALTH_PATTERN)
80-
.addOperationCustomizer(actuatorCustomizer)
81-
.addOpenApiCustomiser(actuatorOpenApiCustomiser)
8280
.build();
8381
// Add the actuator group
8482
newGroups.add(actuatorGroup);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
* The type Actuator open api customiser.
4343
* @author bnasslahsen
4444
*/
45-
public class ActuatorOpenApiCustomizer implements OpenApiCustomiser {
45+
public class ActuatorOpenApiCustomizer implements GlobalOpenApiCustomizer {
4646

4747
/**
4848
* The Path pathern.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
* The type Actuator operation customizer.
5353
* @author bnasslahsen
5454
*/
55-
public class ActuatorOperationCustomizer implements OperationCustomizer {
55+
public class ActuatorOperationCustomizer implements GlobalOperationCustomizer {
5656

5757
/**
5858
* The Method count.
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
*
3+
* *
4+
* * * Copyright 2019-2020 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+
21+
package test.org.springdoc.api.app186;
22+
23+
import static org.springdoc.core.Constants.ALL_PATTERN;
24+
25+
import org.json.JSONException;
26+
import org.junit.jupiter.api.Test;
27+
import org.skyscreamer.jsonassert.Customization;
28+
import org.skyscreamer.jsonassert.JSONAssert;
29+
import org.skyscreamer.jsonassert.JSONCompareMode;
30+
import org.skyscreamer.jsonassert.ValueMatcher;
31+
import org.skyscreamer.jsonassert.comparator.CustomComparator;
32+
import org.skyscreamer.jsonassert.comparator.JSONComparator;
33+
import org.springdoc.core.Constants;
34+
import org.springdoc.core.GroupedOpenApi;
35+
import org.springdoc.core.customizers.OpenApiCustomiser;
36+
import org.springdoc.core.customizers.OperationCustomizer;
37+
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
38+
import org.springframework.boot.autoconfigure.SpringBootApplication;
39+
import org.springframework.boot.test.context.SpringBootTest;
40+
import org.springframework.context.annotation.Bean;
41+
import org.springframework.context.annotation.ComponentScan;
42+
import org.springframework.test.context.TestPropertySource;
43+
44+
import test.org.springdoc.api.AbstractCommonTest;
45+
46+
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
47+
@TestPropertySource(properties={ "springdoc.show-actuator=true",
48+
"springdoc.group-configs[0].group=group-actuator-as-properties",
49+
"springdoc.group-configs[0].paths-to-match=${management.endpoints.web.base-path:/actuator}/**",
50+
"management.endpoints.enabled-by-default=true",
51+
"management.endpoints.web.exposure.include=*",
52+
"management.endpoints.web.exposure.exclude=functions, shutdown"})
53+
public class SpringDocApp186Test extends AbstractCommonTest {
54+
55+
private static final JSONComparator STRICT_IGNORING_OPERATION_ID = new CustomComparator(JSONCompareMode.STRICT,
56+
Customization.customization(
57+
"paths.*.*.operationId"
58+
, new ValueMatcher<Object>() {
59+
@Override
60+
public boolean equal(Object o1, Object o2) {
61+
return true;
62+
}
63+
}));
64+
65+
@SpringBootApplication
66+
@ComponentScan(basePackages = { "org.springdoc", "test.org.springdoc.api.app186" })
67+
static class SpringDocTestApp {
68+
69+
@Bean
70+
public GroupedOpenApi asCodeCheckBackwardsCompatibility(OpenApiCustomiser actuatorOpenApiCustomiser,
71+
OperationCustomizer actuatorCustomizer, WebEndpointProperties endpointProperties) {
72+
return GroupedOpenApi.builder()
73+
.group("group-actuator-as-code-check-backwards-compatibility")
74+
.pathsToMatch(endpointProperties.getBasePath()+ ALL_PATTERN)
75+
.addOpenApiCustomiser(actuatorOpenApiCustomiser)
76+
.addOperationCustomizer(actuatorCustomizer)
77+
.build();
78+
}
79+
80+
@Bean
81+
public GroupedOpenApi asCode(WebEndpointProperties endpointProperties) {
82+
return GroupedOpenApi.builder()
83+
.group("group-actuator-as-code")
84+
.pathsToMatch(endpointProperties.getBasePath()+ ALL_PATTERN)
85+
.build();
86+
}
87+
}
88+
89+
private void assertBodyApp186(String content) {
90+
try {
91+
JSONAssert.assertEquals(getContent("results/app186.json"), content, STRICT_IGNORING_OPERATION_ID);
92+
} catch (JSONException e) {
93+
throw new RuntimeException(e);
94+
}
95+
}
96+
97+
@Test
98+
public void testApp() throws Exception {
99+
webTestClient.get().uri(Constants.DEFAULT_API_DOCS_URL).exchange()
100+
.expectStatus().isOk()
101+
.expectBody(String.class).value(this::assertBodyApp186);
102+
}
103+
104+
@Test
105+
public void testGroupActuatorAsCodeCheckBackwardsCompatibility() throws Exception {
106+
webTestClient.get().uri(Constants.DEFAULT_API_DOCS_URL + "/group-actuator-as-code-check-backwards-compatibility").exchange()
107+
.expectStatus().isOk()
108+
.expectBody(String.class).value(this::assertBodyApp186);
109+
}
110+
111+
@Test
112+
public void testGroupActuatorAsCode() throws Exception {
113+
webTestClient.get().uri(Constants.DEFAULT_API_DOCS_URL + "/group-actuator-as-code").exchange()
114+
.expectStatus().isOk()
115+
.expectBody(String.class).value(this::assertBodyApp186);
116+
}
117+
118+
@Test
119+
public void testGroupActuatorAsProperties() throws Exception {
120+
webTestClient.get().uri(Constants.DEFAULT_API_DOCS_URL + "/group-actuator-as-properties").exchange()
121+
.expectStatus().isOk()
122+
.expectBody(String.class).value(this::assertBodyApp186);
123+
}
124+
125+
}

0 commit comments

Comments
 (0)