Skip to content

Commit 1461070

Browse files
committed
An unresolvable circular reference with management.endpoint.gateway.enabled=true. Fixes #2814
1 parent 896471f commit 1461070

File tree

5 files changed

+31
-60
lines changed

5 files changed

+31
-60
lines changed

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,15 @@
3535
import org.springdoc.core.properties.SpringDocConfigProperties;
3636
import org.springdoc.core.utils.Constants;
3737

38+
import org.springframework.beans.BeansException;
3839
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
3940
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
4041
import org.springframework.boot.autoconfigure.web.ServerProperties;
4142
import org.springframework.boot.web.context.WebServerApplicationContext;
4243
import org.springframework.boot.web.context.WebServerInitializedEvent;
4344
import org.springframework.boot.web.server.WebServer;
4445
import org.springframework.context.ApplicationContext;
46+
import org.springframework.context.ApplicationContextAware;
4547
import org.springframework.context.ApplicationListener;
4648
import org.springframework.util.AntPathMatcher;
4749
import org.springframework.web.method.HandlerMethod;
@@ -54,7 +56,7 @@
5456
*
5557
* @author bnasslahsen
5658
*/
57-
public abstract class ActuatorProvider implements ApplicationListener<WebServerInitializedEvent> {
59+
public abstract class ActuatorProvider implements ApplicationListener<WebServerInitializedEvent>, ApplicationContextAware {
5860

5961
/**
6062
* The Management server properties.
@@ -91,6 +93,11 @@ public abstract class ActuatorProvider implements ApplicationListener<WebServerI
9193
*/
9294
protected ApplicationContext managementApplicationContext;
9395

96+
/**
97+
* The Application context.
98+
*/
99+
protected ApplicationContext applicationContext;
100+
94101
/**
95102
* Instantiates a new Actuator provider.
96103
*
@@ -213,4 +220,8 @@ public int getActuatorPort() {
213220
*/
214221
public abstract Map getMethods();
215222

223+
@Override
224+
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
225+
this.applicationContext = applicationContext;
226+
}
216227
}

springdoc-openapi-starter-webflux-api/src/main/java/org/springdoc/webflux/core/configuration/SpringDocWebFluxConfiguration.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,6 @@
5555
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
5656
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
5757
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
58-
import org.springframework.boot.actuate.endpoint.web.reactive.ControllerEndpointHandlerMapping;
5958
import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
6059
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
6160
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -167,8 +166,6 @@ static class SpringDocWebFluxActuatorConfiguration {
167166
* @param springDocConfigProperties the spring doc config properties
168167
* @param managementServerProperties the management server properties
169168
* @param webEndpointProperties the web endpoint properties
170-
* @param webFluxEndpointHandlerMapping the web flux endpoint handler mapping
171-
* @param controllerEndpointHandlerMapping the controller endpoint handler mapping
172169
* @return the actuator provider
173170
*/
174171
@Bean
@@ -178,15 +175,11 @@ static class SpringDocWebFluxActuatorConfiguration {
178175
ActuatorProvider actuatorProvider(ServerProperties serverProperties,
179176
SpringDocConfigProperties springDocConfigProperties,
180177
Optional<ManagementServerProperties> managementServerProperties,
181-
Optional<WebEndpointProperties> webEndpointProperties,
182-
Optional<WebFluxEndpointHandlerMapping> webFluxEndpointHandlerMapping,
183-
Optional<ControllerEndpointHandlerMapping> controllerEndpointHandlerMapping) {
178+
Optional<WebEndpointProperties> webEndpointProperties) {
184179
return new ActuatorWebFluxProvider(serverProperties,
185180
springDocConfigProperties,
186181
managementServerProperties,
187-
webEndpointProperties,
188-
webFluxEndpointHandlerMapping,
189-
controllerEndpointHandlerMapping);
182+
webEndpointProperties);
190183
}
191184

192185
/**

springdoc-openapi-starter-webflux-api/src/main/java/org/springdoc/webflux/core/providers/ActuatorWebFluxProvider.java

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import org.springframework.boot.actuate.endpoint.web.reactive.ControllerEndpointHandlerMapping;
3939
import org.springframework.boot.actuate.endpoint.web.reactive.WebFluxEndpointHandlerMapping;
4040
import org.springframework.boot.autoconfigure.web.ServerProperties;
41+
import org.springframework.context.ApplicationContextAware;
4142
import org.springframework.web.method.HandlerMethod;
4243
import org.springframework.web.reactive.result.method.RequestMappingInfo;
4344

@@ -47,46 +48,33 @@
4748
*
4849
* @author bnasslahsen
4950
*/
50-
public class ActuatorWebFluxProvider extends ActuatorProvider {
51-
52-
/**
53-
* The Web flux endpoint handler mapping.
54-
*/
55-
private WebFluxEndpointHandlerMapping webFluxEndpointHandlerMapping;
56-
57-
/**
58-
* The Controller endpoint handler mapping.
59-
*/
60-
private ControllerEndpointHandlerMapping controllerEndpointHandlerMapping;
51+
public class ActuatorWebFluxProvider extends ActuatorProvider implements ApplicationContextAware {
6152

53+
6254
/**
6355
* Instantiates a new Actuator web flux provider.
6456
*
6557
* @param serverProperties the server properties
6658
* @param springDocConfigProperties the spring doc config properties
6759
* @param managementServerProperties the management server properties
6860
* @param webEndpointProperties the web endpoint properties
69-
* @param webFluxEndpointHandlerMapping the web flux endpoint handler mapping
70-
* @param controllerEndpointHandlerMapping the controller endpoint handler mapping
7161
*/
7262
public ActuatorWebFluxProvider(ServerProperties serverProperties,
7363
SpringDocConfigProperties springDocConfigProperties,
7464
Optional<ManagementServerProperties> managementServerProperties,
75-
Optional<WebEndpointProperties> webEndpointProperties,
76-
Optional<WebFluxEndpointHandlerMapping> webFluxEndpointHandlerMapping,
77-
Optional<ControllerEndpointHandlerMapping> controllerEndpointHandlerMapping) {
65+
Optional<WebEndpointProperties> webEndpointProperties) {
7866
super(managementServerProperties, webEndpointProperties, serverProperties, springDocConfigProperties);
79-
webFluxEndpointHandlerMapping.ifPresent(webFluxEndpointHandlerMapping1 -> this.webFluxEndpointHandlerMapping = webFluxEndpointHandlerMapping1);
80-
controllerEndpointHandlerMapping.ifPresent(controllerEndpointHandlerMapping1 -> this.controllerEndpointHandlerMapping = controllerEndpointHandlerMapping1);
8167
}
82-
68+
8369
public Map<RequestMappingInfo, HandlerMethod> getMethods() {
8470
Map<RequestMappingInfo, HandlerMethod> mappingInfoHandlerMethodMap = new HashMap<>();
8571

72+
WebFluxEndpointHandlerMapping webFluxEndpointHandlerMapping = applicationContext.getBeansOfType(WebFluxEndpointHandlerMapping.class).values().stream().findFirst().orElse(null);
8673
if (webFluxEndpointHandlerMapping == null)
8774
webFluxEndpointHandlerMapping = managementApplicationContext.getBean(WebFluxEndpointHandlerMapping.class);
8875
mappingInfoHandlerMethodMap.putAll(webFluxEndpointHandlerMapping.getHandlerMethods());
8976

77+
ControllerEndpointHandlerMapping controllerEndpointHandlerMapping = applicationContext.getBeansOfType(ControllerEndpointHandlerMapping.class).values().stream().findFirst().orElse(null);
9078
if (controllerEndpointHandlerMapping == null)
9179
controllerEndpointHandlerMapping = managementApplicationContext.getBean(ControllerEndpointHandlerMapping.class);
9280
mappingInfoHandlerMethodMap.putAll(controllerEndpointHandlerMapping.getHandlerMethods());

springdoc-openapi-starter-webmvc-api/src/main/java/org/springdoc/webmvc/core/configuration/SpringDocWebMvcConfiguration.java

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
import org.springframework.boot.actuate.autoconfigure.web.server.ConditionalOnManagementPort;
5757
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
5858
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties;
59-
import org.springframework.boot.actuate.endpoint.web.servlet.ControllerEndpointHandlerMapping;
6059
import org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping;
6160
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
6261
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -198,8 +197,6 @@ static class SpringDocWebMvcActuatorConfiguration {
198197
* @param springDocConfigProperties the spring doc config properties
199198
* @param managementServerProperties the management server properties
200199
* @param webEndpointProperties the web endpoint properties
201-
* @param webMvcEndpointHandlerMapping the web mvc endpoint handler mapping
202-
* @param controllerEndpointHandlerMapping the controller endpoint handler mapping
203200
* @return the actuator provider
204201
*/
205202
@Bean
@@ -209,15 +206,11 @@ static class SpringDocWebMvcActuatorConfiguration {
209206
ActuatorProvider actuatorProvider(ServerProperties serverProperties,
210207
SpringDocConfigProperties springDocConfigProperties,
211208
Optional<ManagementServerProperties> managementServerProperties,
212-
Optional<WebEndpointProperties> webEndpointProperties,
213-
Optional<WebMvcEndpointHandlerMapping> webMvcEndpointHandlerMapping,
214-
Optional<ControllerEndpointHandlerMapping> controllerEndpointHandlerMapping) {
209+
Optional<WebEndpointProperties> webEndpointProperties) {
215210
return new ActuatorWebMvcProvider(serverProperties,
216211
springDocConfigProperties,
217212
managementServerProperties,
218-
webEndpointProperties,
219-
webMvcEndpointHandlerMapping,
220-
controllerEndpointHandlerMapping);
213+
webEndpointProperties);
221214
}
222215

223216
/**

springdoc-openapi-starter-webmvc-api/src/main/java/org/springdoc/webmvc/core/providers/ActuatorWebMvcProvider.java

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -51,45 +51,31 @@
5151
*/
5252
public class ActuatorWebMvcProvider extends ActuatorProvider {
5353

54-
/**
55-
* The Web mvc endpoint handler mapping.
56-
*/
57-
private WebMvcEndpointHandlerMapping webMvcEndpointHandlerMapping;
58-
59-
/**
60-
* The Controller endpoint handler mapping.
61-
*/
62-
private ControllerEndpointHandlerMapping controllerEndpointHandlerMapping;
63-
6454
/**
6555
* Instantiates a new Actuator web mvc provider.
6656
*
67-
* @param serverProperties the server properties
68-
* @param springDocConfigProperties the spring doc config properties
69-
* @param managementServerProperties the management server properties
70-
* @param webEndpointProperties the web endpoint properties
71-
* @param webMvcEndpointHandlerMapping the web mvc endpoint handler mapping
72-
* @param controllerEndpointHandlerMapping the controller endpoint handler mapping
57+
* @param serverProperties the server properties
58+
* @param springDocConfigProperties the spring doc config properties
59+
* @param managementServerProperties the management server properties
60+
* @param webEndpointProperties the web endpoint properties
7361
*/
7462
public ActuatorWebMvcProvider(ServerProperties serverProperties,
7563
SpringDocConfigProperties springDocConfigProperties,
7664
Optional<ManagementServerProperties> managementServerProperties,
77-
Optional<WebEndpointProperties> webEndpointProperties,
78-
Optional<WebMvcEndpointHandlerMapping> webMvcEndpointHandlerMapping,
79-
Optional<ControllerEndpointHandlerMapping> controllerEndpointHandlerMapping) {
65+
Optional<WebEndpointProperties> webEndpointProperties) {
8066
super(managementServerProperties, webEndpointProperties, serverProperties, springDocConfigProperties);
81-
webMvcEndpointHandlerMapping.ifPresent(webMvcEndpointHandlerMapping1 -> this.webMvcEndpointHandlerMapping = webMvcEndpointHandlerMapping1);
82-
controllerEndpointHandlerMapping.ifPresent(controllerEndpointHandlerMapping1 -> this.controllerEndpointHandlerMapping = controllerEndpointHandlerMapping1);
8367
}
8468

8569
@Override
8670
public Map<RequestMappingInfo, HandlerMethod> getMethods() {
8771
Map<RequestMappingInfo, HandlerMethod> mappingInfoHandlerMethodMap = new HashMap<>();
8872

73+
WebMvcEndpointHandlerMapping webMvcEndpointHandlerMapping = applicationContext.getBeansOfType(WebMvcEndpointHandlerMapping.class).values().stream().findFirst().orElse(null);
8974
if (webMvcEndpointHandlerMapping == null)
9075
webMvcEndpointHandlerMapping = managementApplicationContext.getBean(WebMvcEndpointHandlerMapping.class);
9176
mappingInfoHandlerMethodMap.putAll(webMvcEndpointHandlerMapping.getHandlerMethods());
9277

78+
ControllerEndpointHandlerMapping controllerEndpointHandlerMapping = applicationContext.getBeansOfType(ControllerEndpointHandlerMapping.class).values().stream().findFirst().orElse(null);
9379
if (controllerEndpointHandlerMapping == null)
9480
controllerEndpointHandlerMapping = managementApplicationContext.getBean(ControllerEndpointHandlerMapping.class);
9581
mappingInfoHandlerMethodMap.putAll(controllerEndpointHandlerMapping.getHandlerMethods());
@@ -102,4 +88,4 @@ public String getContextPath() {
10288
return StringUtils.defaultIfEmpty(serverProperties.getServlet().getContextPath(), EMPTY);
10389
}
10490

105-
}
91+
}

0 commit comments

Comments
 (0)