Skip to content

Commit 1397169

Browse files
committed
Docs and actuator endpoints can be enabled when endpoints.enabled=false
Previously, if endpoints.enabled was false setting endpoints.docs.enabled=true or endpoints.actuator.enabled=true would have no effect as their entire configuration class was conditional on endpoints.enabled being true. This commit updates the conditions on the configuration class so that it is conditional on either the actuator or docs endpoint being enabled. Closes gh-5007
1 parent 72aae34 commit 1397169

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcHypermediaManagementContextConfiguration.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@
3232
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
3333

3434
import org.springframework.beans.factory.annotation.Autowired;
35+
import org.springframework.boot.actuate.autoconfigure.EndpointWebMvcHypermediaManagementContextConfiguration.EndpointHypermediaEnabledCondition;
36+
import org.springframework.boot.actuate.condition.ConditionalOnEnabledEndpoint;
3537
import org.springframework.boot.actuate.endpoint.mvc.DocsMvcEndpoint;
3638
import org.springframework.boot.actuate.endpoint.mvc.HalBrowserMvcEndpoint;
3739
import org.springframework.boot.actuate.endpoint.mvc.HalJsonMvcEndpoint;
3840
import org.springframework.boot.actuate.endpoint.mvc.HypermediaDisabled;
3941
import org.springframework.boot.actuate.endpoint.mvc.ManagementServletContext;
4042
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
4143
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoints;
44+
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
4245
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
4346
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
4447
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -50,6 +53,7 @@
5053
import org.springframework.boot.autoconfigure.web.ServerProperties;
5154
import org.springframework.boot.context.properties.EnableConfigurationProperties;
5255
import org.springframework.context.annotation.Bean;
56+
import org.springframework.context.annotation.Conditional;
5357
import org.springframework.core.MethodParameter;
5458
import org.springframework.core.annotation.AnnotationUtils;
5559
import org.springframework.core.io.ResourceLoader;
@@ -85,7 +89,7 @@
8589
@ConditionalOnClass(Link.class)
8690
@ConditionalOnWebApplication
8791
@ConditionalOnBean(HttpMessageConverters.class)
88-
@ConditionalOnProperty(value = "endpoints.enabled", matchIfMissing = true)
92+
@Conditional(EndpointHypermediaEnabledCondition.class)
8993
@EnableConfigurationProperties(ResourceProperties.class)
9094
public class EndpointWebMvcHypermediaManagementContextConfiguration {
9195

@@ -102,7 +106,7 @@ public String getContextPath() {
102106
};
103107
}
104108

105-
@ConditionalOnProperty(prefix = "endpoints.actuator", name = "enabled", matchIfMissing = true)
109+
@ConditionalOnEnabledEndpoint("actuator")
106110
@Bean
107111
public HalJsonMvcEndpoint halJsonMvcEndpoint(
108112
ManagementServletContext managementServletContext,
@@ -114,7 +118,7 @@ public HalJsonMvcEndpoint halJsonMvcEndpoint(
114118
}
115119

116120
@Bean
117-
@ConditionalOnProperty(prefix = "endpoints.docs", name = "enabled", matchIfMissing = true)
121+
@ConditionalOnEnabledEndpoint("docs")
118122
@ConditionalOnResource(resources = "classpath:/META-INF/resources/spring-boot-actuator/docs/index.html")
119123
public DocsMvcEndpoint docsMvcEndpoint(
120124
ManagementServletContext managementServletContext) {
@@ -333,4 +337,22 @@ public Map<String, Object> getEmbedded() {
333337

334338
}
335339

340+
static class EndpointHypermediaEnabledCondition extends AnyNestedCondition {
341+
342+
public EndpointHypermediaEnabledCondition() {
343+
super(ConfigurationPhase.REGISTER_BEAN);
344+
}
345+
346+
@ConditionalOnEnabledEndpoint("actuator")
347+
static class ActuatorEndpointEnabled {
348+
349+
}
350+
351+
@ConditionalOnEnabledEndpoint("docs")
352+
static class DocsEndpointEnabled {
353+
354+
}
355+
356+
}
357+
336358
}

spring-boot-actuator/src/main/java/org/springframework/boot/actuate/condition/ConditionalOnEnabledEndpoint.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2015 the original author or authors.
2+
* Copyright 2012-2016 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@
3535
*/
3636
@Conditional(OnEnabledEndpointCondition.class)
3737
@Retention(RetentionPolicy.RUNTIME)
38-
@Target(ElementType.METHOD)
38+
@Target({ ElementType.METHOD, ElementType.TYPE })
3939
public @interface ConditionalOnEnabledEndpoint {
4040

4141
/**

spring-boot-actuator/src/test/java/org/springframework/boot/actuate/autoconfigure/EndpointWebMvcAutoConfigurationTests.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;
4141
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMappingCustomizer;
4242
import org.springframework.boot.actuate.endpoint.mvc.EnvironmentMvcEndpoint;
43+
import org.springframework.boot.actuate.endpoint.mvc.HalJsonMvcEndpoint;
4344
import org.springframework.boot.actuate.endpoint.mvc.HealthMvcEndpoint;
4445
import org.springframework.boot.actuate.endpoint.mvc.MetricsMvcEndpoint;
4546
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
@@ -455,6 +456,18 @@ public void shutdownEndpointEnabled() {
455456
is(equalTo(1)));
456457
}
457458

459+
@Test
460+
public void actuatorEndpointEnabledIndividually() {
461+
this.applicationContext.register(RootConfig.class, BaseConfiguration.class,
462+
ServerPortConfig.class, EndpointWebMvcAutoConfiguration.class);
463+
EnvironmentTestUtils.addEnvironment(this.applicationContext,
464+
"endpoints.enabled:false", "endpoints.actuator.enabled:true");
465+
this.applicationContext.refresh();
466+
assertThat(
467+
this.applicationContext.getBeansOfType(HalJsonMvcEndpoint.class).size(),
468+
is(equalTo(1)));
469+
}
470+
458471
private void endpointDisabled(String name, Class<? extends MvcEndpoint> type) {
459472
this.applicationContext.register(RootConfig.class, BaseConfiguration.class,
460473
ServerPortConfig.class, EndpointWebMvcAutoConfiguration.class);

0 commit comments

Comments
 (0)