Browse Source

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
pull/1979/merge
Dave Syer 12 years ago
parent
commit
9db86bbd2a
  1. 4
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/autoconfigure/EndpointAutoConfiguration.java
  2. 26
      spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java
  3. 15
      spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointMethodAnnotationsTests.java
  4. 44
      spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointParentTests.java
  5. 8
      spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointProxyTests.java
  6. 5
      spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointSerializationTests.java

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

@ -162,9 +162,7 @@ public class EndpointAutoConfiguration { @@ -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

26
spring-boot-actuator/src/main/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpoint.java

@ -83,8 +83,6 @@ public class ConfigurationPropertiesReportEndpoint extends @@ -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 @@ -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 @@ -130,8 +123,10 @@ public class ConfigurationPropertiesReportEndpoint extends
Map<String, Object> result = new HashMap<String, Object>();
Map<String, Object> beans = new HashMap<String, Object>(
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 @@ -143,7 +138,7 @@ public class ConfigurationPropertiesReportEndpoint extends
String beanName = entry.getKey();
Object bean = entry.getValue();
Map<String, Object> root = new HashMap<String, Object>();
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 @@ -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

15
spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointMethodAnnotationsTests.java

@ -21,7 +21,6 @@ import java.util.Map; @@ -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 { @@ -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 { @@ -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

44
spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointParentTests.java

@ -20,6 +20,8 @@ import java.util.Map; @@ -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 { @@ -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<String, Object> 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 { @@ -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 {

8
spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointProxyTests.java

@ -23,7 +23,6 @@ import javax.sql.DataSource; @@ -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 { @@ -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

5
spring-boot-actuator/src/test/java/org/springframework/boot/actuate/endpoint/ConfigurationPropertiesReportEndpointSerializationTests.java

@ -23,7 +23,6 @@ import java.util.Map; @@ -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 { @@ -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;
}

Loading…
Cancel
Save