Skip to content

Commit f0e934e

Browse files
committed
Merge pull request #17418 from htztomic
* pr/17418: Polish "Provide links / when using a separate management port" Provide links for actuators at / when using a separate management port Closes gh-17418
2 parents edea223 + 39b15af commit f0e934e

File tree

19 files changed

+244
-35
lines changed

19 files changed

+244
-35
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/reactive/CloudFoundryWebFluxEndpointHandlerMapping.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class CloudFoundryWebFluxEndpointHandlerMapping extends AbstractWebFluxEndpointH
6060
Collection<ExposableWebEndpoint> endpoints, EndpointMediaTypes endpointMediaTypes,
6161
CorsConfiguration corsConfiguration, CloudFoundrySecurityInterceptor securityInterceptor,
6262
EndpointLinksResolver linksResolver) {
63-
super(endpointMapping, endpoints, endpointMediaTypes, corsConfiguration);
63+
super(endpointMapping, endpoints, endpointMediaTypes, corsConfiguration, true);
6464
this.linksResolver = linksResolver;
6565
this.securityInterceptor = securityInterceptor;
6666
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/cloudfoundry/servlet/CloudFoundryWebEndpointServletHandlerMapping.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class CloudFoundryWebEndpointServletHandlerMapping extends AbstractWebMvcEndpoin
5959
Collection<ExposableWebEndpoint> endpoints, EndpointMediaTypes endpointMediaTypes,
6060
CorsConfiguration corsConfiguration, CloudFoundrySecurityInterceptor securityInterceptor,
6161
EndpointLinksResolver linksResolver) {
62-
super(endpointMapping, endpoints, endpointMediaTypes, corsConfiguration);
62+
super(endpointMapping, endpoints, endpointMediaTypes, corsConfiguration, true);
6363
this.securityInterceptor = securityInterceptor;
6464
this.linksResolver = linksResolver;
6565
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/jersey/JerseyWebEndpointManagementContextConfiguration.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
2828
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
29+
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
2930
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
3031
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
3132
import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
@@ -42,6 +43,8 @@
4243
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
4344
import org.springframework.boot.autoconfigure.jersey.ResourceConfigCustomizer;
4445
import org.springframework.context.annotation.Bean;
46+
import org.springframework.core.env.Environment;
47+
import org.springframework.util.StringUtils;
4548

4649
/**
4750
* {@link ManagementContextConfiguration @ManagementContextConfiguration} for Jersey
@@ -62,7 +65,7 @@ class JerseyWebEndpointManagementContextConfiguration {
6265
@Bean
6366
ResourceConfigCustomizer webEndpointRegistrar(WebEndpointsSupplier webEndpointsSupplier,
6467
ServletEndpointsSupplier servletEndpointsSupplier, EndpointMediaTypes endpointMediaTypes,
65-
WebEndpointProperties webEndpointProperties) {
68+
WebEndpointProperties webEndpointProperties, Environment environment) {
6669
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
6770
allEndpoints.addAll(webEndpointsSupplier.getEndpoints());
6871
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
@@ -73,8 +76,14 @@ ResourceConfigCustomizer webEndpointRegistrar(WebEndpointsSupplier webEndpointsS
7376
Collection<ExposableWebEndpoint> webEndpoints = Collections
7477
.unmodifiableCollection(webEndpointsSupplier.getEndpoints());
7578
resourceConfig.registerResources(new HashSet<>(resourceFactory.createEndpointResources(endpointMapping,
76-
webEndpoints, endpointMediaTypes, new EndpointLinksResolver(allEndpoints, basePath))));
79+
webEndpoints, endpointMediaTypes, new EndpointLinksResolver(allEndpoints, basePath),
80+
shouldRegisterLinksMapping(environment, basePath))));
7781
};
7882
}
7983

84+
private boolean shouldRegisterLinksMapping(Environment environment, String basePath) {
85+
return StringUtils.hasText(basePath)
86+
|| ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT);
87+
}
88+
8089
}

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/reactive/WebFluxEndpointManagementContextConfiguration.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
2424
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
2525
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
2627
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
2728
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
2829
import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
@@ -40,7 +41,9 @@
4041
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
4142
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4243
import org.springframework.context.annotation.Bean;
44+
import org.springframework.core.env.Environment;
4345
import org.springframework.http.server.reactive.HttpHandler;
46+
import org.springframework.util.StringUtils;
4447
import org.springframework.web.reactive.DispatcherHandler;
4548

4649
/**
@@ -62,15 +65,22 @@ public class WebFluxEndpointManagementContextConfiguration {
6265
@ConditionalOnMissingBean
6366
public WebFluxEndpointHandlerMapping webEndpointReactiveHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
6467
ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes,
65-
CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties) {
66-
EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
68+
CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties,
69+
Environment environment) {
70+
String basePath = webEndpointProperties.getBasePath();
71+
EndpointMapping endpointMapping = new EndpointMapping(basePath);
6772
Collection<ExposableWebEndpoint> endpoints = webEndpointsSupplier.getEndpoints();
6873
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
6974
allEndpoints.addAll(endpoints);
7075
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
7176
return new WebFluxEndpointHandlerMapping(endpointMapping, endpoints, endpointMediaTypes,
72-
corsProperties.toCorsConfiguration(),
73-
new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()));
77+
corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),
78+
shouldRegisterLinksMapping(environment, basePath));
79+
}
80+
81+
private boolean shouldRegisterLinksMapping(Environment environment, String basePath) {
82+
return StringUtils.hasText(basePath)
83+
|| ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT);
7484
}
7585

7686
@Bean

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/endpoint/web/servlet/WebMvcEndpointManagementContextConfiguration.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.boot.actuate.autoconfigure.endpoint.web.CorsEndpointProperties;
2424
import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointProperties;
2525
import org.springframework.boot.actuate.autoconfigure.web.ManagementContextConfiguration;
26+
import org.springframework.boot.actuate.autoconfigure.web.server.ManagementPortType;
2627
import org.springframework.boot.actuate.endpoint.ExposableEndpoint;
2728
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
2829
import org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver;
@@ -41,6 +42,8 @@
4142
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
4243
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4344
import org.springframework.context.annotation.Bean;
45+
import org.springframework.core.env.Environment;
46+
import org.springframework.util.StringUtils;
4447
import org.springframework.web.servlet.DispatcherServlet;
4548

4649
/**
@@ -63,16 +66,19 @@ public class WebMvcEndpointManagementContextConfiguration {
6366
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
6467
ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
6568
EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
66-
WebEndpointProperties webEndpointProperties) {
69+
WebEndpointProperties webEndpointProperties, Environment environment) {
6770
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
6871
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
6972
allEndpoints.addAll(webEndpoints);
7073
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
7174
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
72-
EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
75+
String basePath = webEndpointProperties.getBasePath();
76+
EndpointMapping endpointMapping = new EndpointMapping(basePath);
77+
boolean shouldRegisterLinksMapping = StringUtils.hasText(basePath)
78+
|| ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT);
7379
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
74-
corsProperties.toCorsConfiguration(),
75-
new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()));
80+
corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),
81+
shouldRegisterLinksMapping);
7682
}
7783

7884
@Bean

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/security/servlet/JerseyEndpointRequestIntegrationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ private void customize(ResourceConfig config) {
133133
Arrays.asList(EndpointId::toString), Collections.emptyList(), Collections.emptyList());
134134
Collection<Resource> resources = new JerseyEndpointResourceFactory().createEndpointResources(
135135
new EndpointMapping("/actuator"), discoverer.getEndpoints(), endpointMediaTypes,
136-
new EndpointLinksResolver(discoverer.getEndpoints()));
136+
new EndpointLinksResolver(discoverer.getEndpoints()), true);
137137
config.registerResources(new HashSet<>(resources));
138138
}
139139

spring-boot-project/spring-boot-actuator-autoconfigure/src/test/java/org/springframework/boot/actuate/autoconfigure/security/servlet/MvcEndpointRequestIntegrationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping() {
119119
new ConversionServiceParameterValueMapper(), endpointMediaTypes,
120120
Arrays.asList(EndpointId::toString), Collections.emptyList(), Collections.emptyList());
121121
return new WebMvcEndpointHandlerMapping(new EndpointMapping("/actuator"), discoverer.getEndpoints(),
122-
endpointMediaTypes, new CorsConfiguration(), new EndpointLinksResolver(discoverer.getEndpoints()));
122+
endpointMediaTypes, new CorsConfiguration(), new EndpointLinksResolver(discoverer.getEndpoints()),
123+
true);
123124
}
124125

125126
}

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/jersey/JerseyEndpointResourceFactory.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,16 @@ public class JerseyEndpointResourceFactory {
7171
* @param endpoints the web endpoints
7272
* @param endpointMediaTypes media types consumed and produced by the endpoints
7373
* @param linksResolver resolver for determining links to available endpoints
74+
* @param shouldRegisterLinks should register links
7475
* @return the resources for the operations
7576
*/
7677
public Collection<Resource> createEndpointResources(EndpointMapping endpointMapping,
7778
Collection<ExposableWebEndpoint> endpoints, EndpointMediaTypes endpointMediaTypes,
78-
EndpointLinksResolver linksResolver) {
79+
EndpointLinksResolver linksResolver, boolean shouldRegisterLinks) {
7980
List<Resource> resources = new ArrayList<>();
8081
endpoints.stream().flatMap((endpoint) -> endpoint.getOperations().stream())
8182
.map((operation) -> createResource(endpointMapping, operation)).forEach(resources::add);
82-
if (StringUtils.hasText(endpointMapping.getPath())) {
83+
if (shouldRegisterLinks) {
8384
Resource resource = createEndpointLinksResource(endpointMapping.getPath(), endpointMediaTypes,
8485
linksResolver);
8586
resources.add(resource);

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/AbstractWebFluxEndpointHandlerMapping.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,21 +95,25 @@ public abstract class AbstractWebFluxEndpointHandlerMapping extends RequestMappi
9595
private final Method handleReadMethod = ReflectionUtils.findMethod(ReadOperationHandler.class, "handle",
9696
ServerWebExchange.class);
9797

98+
private final boolean shouldRegisterLinksMapping;
99+
98100
/**
99101
* Creates a new {@code AbstractWebFluxEndpointHandlerMapping} that provides mappings
100102
* for the operations of the given {@code webEndpoints}.
101103
* @param endpointMapping the base mapping for all endpoints
102104
* @param endpoints the web endpoints
103105
* @param endpointMediaTypes media types consumed and produced by the endpoints
104106
* @param corsConfiguration the CORS configuration for the endpoints
107+
* @param shouldRegisterLinksMapping whether the links endpoint should be registered
105108
*/
106109
public AbstractWebFluxEndpointHandlerMapping(EndpointMapping endpointMapping,
107110
Collection<ExposableWebEndpoint> endpoints, EndpointMediaTypes endpointMediaTypes,
108-
CorsConfiguration corsConfiguration) {
111+
CorsConfiguration corsConfiguration, boolean shouldRegisterLinksMapping) {
109112
this.endpointMapping = endpointMapping;
110113
this.endpoints = endpoints;
111114
this.endpointMediaTypes = endpointMediaTypes;
112115
this.corsConfiguration = corsConfiguration;
116+
this.shouldRegisterLinksMapping = shouldRegisterLinksMapping;
113117
setOrder(-100);
114118
}
115119

@@ -120,7 +124,7 @@ protected void initHandlerMethods() {
120124
registerMappingForOperation(endpoint, operation);
121125
}
122126
}
123-
if (StringUtils.hasText(this.endpointMapping.getPath())) {
127+
if (this.shouldRegisterLinksMapping) {
124128
registerLinksMapping();
125129
}
126130
}

spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/web/reactive/WebFluxEndpointHandlerMapping.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,12 @@ public class WebFluxEndpointHandlerMapping extends AbstractWebFluxEndpointHandle
5353
* @param endpointMediaTypes media types consumed and produced by the endpoints
5454
* @param corsConfiguration the CORS configuration for the endpoints or {@code null}
5555
* @param linksResolver resolver for determining links to available endpoints
56+
* @param shouldRegisterLinksMapping whether the links endpoint should be registered
5657
*/
5758
public WebFluxEndpointHandlerMapping(EndpointMapping endpointMapping, Collection<ExposableWebEndpoint> endpoints,
5859
EndpointMediaTypes endpointMediaTypes, CorsConfiguration corsConfiguration,
59-
EndpointLinksResolver linksResolver) {
60-
super(endpointMapping, endpoints, endpointMediaTypes, corsConfiguration);
60+
EndpointLinksResolver linksResolver, boolean shouldRegisterLinksMapping) {
61+
super(endpointMapping, endpoints, endpointMediaTypes, corsConfiguration, shouldRegisterLinksMapping);
6162
this.linksResolver = linksResolver;
6263
setOrder(-100);
6364
}

0 commit comments

Comments
 (0)