diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java index 4e878bd9928..43da23e1f6b 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java @@ -162,9 +162,7 @@ public class EndpointAutoConfiguration { @Bean @ConditionalOnMissingBean public ConfigurationPropertiesReportEndpoint configurationPropertiesReportEndpoint() { - ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint(); - endpoint.setConfigurationBeanFactoryMetaData(this.beanFactoryMetaData); - return endpoint; + return new ConfigurationPropertiesReportEndpoint(); } @Configuration diff --git a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java index 788da909b58..f0a729ad529 100644 --- a/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java +++ b/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java @@ -83,8 +83,6 @@ public class ConfigurationPropertiesReportEndpoint extends private ApplicationContext context; - private ConfigurationBeanFactoryMetaData beanFactoryMetaData; - private ConfigurationPropertiesMetaData metadata; private String metadataLocations = "classpath:*/META-INF/*spring-configuration-metadata.json"; @@ -98,11 +96,6 @@ public class ConfigurationPropertiesReportEndpoint extends this.context = context; } - public void setConfigurationBeanFactoryMetaData( - ConfigurationBeanFactoryMetaData beanFactoryMetaData) { - this.beanFactoryMetaData = beanFactoryMetaData; - } - public void setKeysToSanitize(String... keysToSanitize) { this.sanitizer.setKeysToSanitize(keysToSanitize); } @@ -130,8 +123,10 @@ public class ConfigurationPropertiesReportEndpoint extends Map result = new HashMap(); Map beans = new HashMap( context.getBeansWithAnnotation(ConfigurationProperties.class)); - if (this.beanFactoryMetaData != null) { - beans.putAll(this.beanFactoryMetaData + ConfigurationBeanFactoryMetaData beanFactoryMetaData = null; + if (context.getBeanNamesForType(ConfigurationBeanFactoryMetaData.class).length == 1) { + beanFactoryMetaData = context.getBean(ConfigurationBeanFactoryMetaData.class); + beans.putAll(beanFactoryMetaData .getBeansWithFactoryAnnotation(ConfigurationProperties.class)); } @@ -143,7 +138,7 @@ public class ConfigurationPropertiesReportEndpoint extends String beanName = entry.getKey(); Object bean = entry.getValue(); Map root = new HashMap(); - String prefix = extractPrefix(context, beanName, bean); + String prefix = extractPrefix(context, beanFactoryMetaData, beanName, bean); root.put("prefix", prefix); root.put("properties", sanitize(safeSerialize(mapper, bean, prefix))); result.put(beanName, root); @@ -209,13 +204,16 @@ public class ConfigurationPropertiesReportEndpoint extends /** * Extract configuration prefix from {@link ConfigurationProperties} annotation. + * @param beanFactoryMetaData */ - private String extractPrefix(ApplicationContext context, String beanName, Object bean) { + private String extractPrefix(ApplicationContext context, + ConfigurationBeanFactoryMetaData beanFactoryMetaData, String beanName, + Object bean) { ConfigurationProperties annotation = context.findAnnotationOnBean(beanName, ConfigurationProperties.class); - if (this.beanFactoryMetaData != null) { - ConfigurationProperties override = this.beanFactoryMetaData - .findFactoryAnnotation(beanName, ConfigurationProperties.class); + if (beanFactoryMetaData != null) { + ConfigurationProperties override = beanFactoryMetaData.findFactoryAnnotation( + beanName, ConfigurationProperties.class); if (override != null) { // The @Bean-level @ConfigurationProperties overrides the one at type // level when binding. Arguably we should render them both, but this one diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointMethodAnnotationsTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointMethodAnnotationsTests.java index 2feb2d8f6d6..fd4ee134bf5 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointMethodAnnotationsTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointMethodAnnotationsTests.java @@ -21,7 +21,6 @@ import java.util.Map; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.EnvironmentTestUtils; @@ -86,11 +85,8 @@ public class ConfigurationPropertiesReportEndpointMethodAnnotationsTests { public static class Config { @Bean - public ConfigurationPropertiesReportEndpoint endpoint( - ConfigurationBeanFactoryMetaData beanFactoryMetaData) { - ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint(); - endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData); - return endpoint; + public ConfigurationPropertiesReportEndpoint endpoint() { + return new ConfigurationPropertiesReportEndpoint(); } @Bean @@ -112,11 +108,8 @@ public class ConfigurationPropertiesReportEndpointMethodAnnotationsTests { public static class Other { @Bean - public ConfigurationPropertiesReportEndpoint endpoint( - ConfigurationBeanFactoryMetaData beanFactoryMetaData) { - ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint(); - endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData); - return endpoint; + public ConfigurationPropertiesReportEndpoint endpoint() { + return new ConfigurationPropertiesReportEndpoint(); } @Bean diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointParentTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointParentTests.java index 9f03e47b0d9..97adecce74a 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointParentTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointParentTests.java @@ -20,6 +20,8 @@ import java.util.Map; import org.junit.After; import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.ConfigurableApplicationContext; @@ -61,6 +63,23 @@ public class ConfigurationPropertiesReportEndpointParentTests { // System.err.println(result); } + @Test + public void testInvokeWithFactory() throws Exception { + AnnotationConfigApplicationContext parent = new AnnotationConfigApplicationContext(); + parent.register(Parent.class); + parent.refresh(); + this.context = new AnnotationConfigApplicationContext(); + this.context.setParent(parent); + this.context.register(Factory.class); + this.context.refresh(); + ConfigurationPropertiesReportEndpoint endpoint = this.context + .getBean(ConfigurationPropertiesReportEndpoint.class); + Map result = endpoint.invoke(); + assertTrue(result.containsKey("parent")); + assertEquals(3, result.size()); // the endpoint, the test props and the parent + // System.err.println(result); + } + @Configuration @EnableConfigurationProperties public static class Parent { @@ -80,12 +99,35 @@ public class ConfigurationPropertiesReportEndpointParentTests { } @Bean - public TestProperties testProperties() { + public TestProperties someProperties() { return new TestProperties(); } } + @Configuration + @EnableConfigurationProperties + public static class Factory { + + @Autowired + private ConfigurationBeanFactoryMetaData beanFactoryMetaData; + + @Bean + public ConfigurationPropertiesReportEndpoint endpoint() { + return new ConfigurationPropertiesReportEndpoint(); + } + + @Bean + @ConfigurationProperties(prefix = "other") + public OtherProperties otherProperties() { + return new OtherProperties(); + } + + } + + public static class OtherProperties { + } + @ConfigurationProperties(prefix = "test") public static class TestProperties { diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointProxyTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointProxyTests.java index 2fb38f7b6ee..1c2b9c14e65 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointProxyTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointProxyTests.java @@ -23,7 +23,6 @@ import javax.sql.DataSource; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -78,11 +77,8 @@ public class ConfigurationPropertiesReportEndpointProxyTests { public static class Config { @Bean - public ConfigurationPropertiesReportEndpoint endpoint( - ConfigurationBeanFactoryMetaData beanFactoryMetaData) { - ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint(); - endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData); - return endpoint; + public ConfigurationPropertiesReportEndpoint endpoint() { + return new ConfigurationPropertiesReportEndpoint(); } @Bean diff --git a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointSerializationTests.java b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointSerializationTests.java index d4d104316d8..8c954d49c84 100644 --- a/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointSerializationTests.java +++ b/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointSerializationTests.java @@ -23,7 +23,6 @@ import java.util.Map; import org.junit.After; import org.junit.Before; import org.junit.Test; -import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.test.EnvironmentTestUtils; @@ -238,10 +237,8 @@ public class ConfigurationPropertiesReportEndpointSerializationTests { public static class Base { @Bean - public ConfigurationPropertiesReportEndpoint endpoint( - ConfigurationBeanFactoryMetaData beanFactoryMetaData) { + public ConfigurationPropertiesReportEndpoint endpoint() { ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint(); - endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData); endpoint.setMetadataLocations("classpath*:/test-metadata.json"); return endpoint; }