From 9db86bbd2aed84d5f8483c1e449c8cd4746c7994 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sun, 23 Nov 2014 11:16:45 +0000 Subject: [PATCH] Lookup metadata bean from context instead of injecting That way, if there is one, it will always be the right one (otherwise you might be processing teh parent context with metadata from the child). Fixes gh-1982 --- .../EndpointAutoConfiguration.java | 4 +- ...ConfigurationPropertiesReportEndpoint.java | 26 +++++------ ...sReportEndpointMethodAnnotationsTests.java | 15 ++----- ...onPropertiesReportEndpointParentTests.java | 44 ++++++++++++++++++- ...ionPropertiesReportEndpointProxyTests.java | 8 +--- ...rtiesReportEndpointSerializationTests.java | 5 +-- 6 files changed, 63 insertions(+), 39 deletions(-) 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; }