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
This commit is contained in:
parent
f21d58ada7
commit
9db86bbd2a
|
|
@ -162,9 +162,7 @@ public class EndpointAutoConfiguration {
|
||||||
@Bean
|
@Bean
|
||||||
@ConditionalOnMissingBean
|
@ConditionalOnMissingBean
|
||||||
public ConfigurationPropertiesReportEndpoint configurationPropertiesReportEndpoint() {
|
public ConfigurationPropertiesReportEndpoint configurationPropertiesReportEndpoint() {
|
||||||
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
|
return new ConfigurationPropertiesReportEndpoint();
|
||||||
endpoint.setConfigurationBeanFactoryMetaData(this.beanFactoryMetaData);
|
|
||||||
return endpoint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
|
|
|
||||||
|
|
@ -83,8 +83,6 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
|
|
||||||
private ApplicationContext context;
|
private ApplicationContext context;
|
||||||
|
|
||||||
private ConfigurationBeanFactoryMetaData beanFactoryMetaData;
|
|
||||||
|
|
||||||
private ConfigurationPropertiesMetaData metadata;
|
private ConfigurationPropertiesMetaData metadata;
|
||||||
|
|
||||||
private String metadataLocations = "classpath:*/META-INF/*spring-configuration-metadata.json";
|
private String metadataLocations = "classpath:*/META-INF/*spring-configuration-metadata.json";
|
||||||
|
|
@ -98,11 +96,6 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
this.context = context;
|
this.context = context;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConfigurationBeanFactoryMetaData(
|
|
||||||
ConfigurationBeanFactoryMetaData beanFactoryMetaData) {
|
|
||||||
this.beanFactoryMetaData = beanFactoryMetaData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setKeysToSanitize(String... keysToSanitize) {
|
public void setKeysToSanitize(String... keysToSanitize) {
|
||||||
this.sanitizer.setKeysToSanitize(keysToSanitize);
|
this.sanitizer.setKeysToSanitize(keysToSanitize);
|
||||||
}
|
}
|
||||||
|
|
@ -130,8 +123,10 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
Map<String, Object> result = new HashMap<String, Object>();
|
Map<String, Object> result = new HashMap<String, Object>();
|
||||||
Map<String, Object> beans = new HashMap<String, Object>(
|
Map<String, Object> beans = new HashMap<String, Object>(
|
||||||
context.getBeansWithAnnotation(ConfigurationProperties.class));
|
context.getBeansWithAnnotation(ConfigurationProperties.class));
|
||||||
if (this.beanFactoryMetaData != null) {
|
ConfigurationBeanFactoryMetaData beanFactoryMetaData = null;
|
||||||
beans.putAll(this.beanFactoryMetaData
|
if (context.getBeanNamesForType(ConfigurationBeanFactoryMetaData.class).length == 1) {
|
||||||
|
beanFactoryMetaData = context.getBean(ConfigurationBeanFactoryMetaData.class);
|
||||||
|
beans.putAll(beanFactoryMetaData
|
||||||
.getBeansWithFactoryAnnotation(ConfigurationProperties.class));
|
.getBeansWithFactoryAnnotation(ConfigurationProperties.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -143,7 +138,7 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
String beanName = entry.getKey();
|
String beanName = entry.getKey();
|
||||||
Object bean = entry.getValue();
|
Object bean = entry.getValue();
|
||||||
Map<String, Object> root = new HashMap<String, Object>();
|
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("prefix", prefix);
|
||||||
root.put("properties", sanitize(safeSerialize(mapper, bean, prefix)));
|
root.put("properties", sanitize(safeSerialize(mapper, bean, prefix)));
|
||||||
result.put(beanName, root);
|
result.put(beanName, root);
|
||||||
|
|
@ -209,13 +204,16 @@ public class ConfigurationPropertiesReportEndpoint extends
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extract configuration prefix from {@link ConfigurationProperties} annotation.
|
* 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 annotation = context.findAnnotationOnBean(beanName,
|
||||||
ConfigurationProperties.class);
|
ConfigurationProperties.class);
|
||||||
if (this.beanFactoryMetaData != null) {
|
if (beanFactoryMetaData != null) {
|
||||||
ConfigurationProperties override = this.beanFactoryMetaData
|
ConfigurationProperties override = beanFactoryMetaData.findFactoryAnnotation(
|
||||||
.findFactoryAnnotation(beanName, ConfigurationProperties.class);
|
beanName, ConfigurationProperties.class);
|
||||||
if (override != null) {
|
if (override != null) {
|
||||||
// The @Bean-level @ConfigurationProperties overrides the one at type
|
// The @Bean-level @ConfigurationProperties overrides the one at type
|
||||||
// level when binding. Arguably we should render them both, but this one
|
// level when binding. Arguably we should render them both, but this one
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import java.util.Map;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData;
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||||
|
|
@ -86,11 +85,8 @@ public class ConfigurationPropertiesReportEndpointMethodAnnotationsTests {
|
||||||
public static class Config {
|
public static class Config {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ConfigurationPropertiesReportEndpoint endpoint(
|
public ConfigurationPropertiesReportEndpoint endpoint() {
|
||||||
ConfigurationBeanFactoryMetaData beanFactoryMetaData) {
|
return new ConfigurationPropertiesReportEndpoint();
|
||||||
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
|
|
||||||
endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData);
|
|
||||||
return endpoint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|
@ -112,11 +108,8 @@ public class ConfigurationPropertiesReportEndpointMethodAnnotationsTests {
|
||||||
public static class Other {
|
public static class Other {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ConfigurationPropertiesReportEndpoint endpoint(
|
public ConfigurationPropertiesReportEndpoint endpoint() {
|
||||||
ConfigurationBeanFactoryMetaData beanFactoryMetaData) {
|
return new ConfigurationPropertiesReportEndpoint();
|
||||||
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
|
|
||||||
endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData);
|
|
||||||
return endpoint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,8 @@ import java.util.Map;
|
||||||
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Test;
|
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.ConfigurationProperties;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.ConfigurableApplicationContext;
|
import org.springframework.context.ConfigurableApplicationContext;
|
||||||
|
|
@ -61,6 +63,23 @@ public class ConfigurationPropertiesReportEndpointParentTests {
|
||||||
// System.err.println(result);
|
// 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
|
@Configuration
|
||||||
@EnableConfigurationProperties
|
@EnableConfigurationProperties
|
||||||
public static class Parent {
|
public static class Parent {
|
||||||
|
|
@ -80,12 +99,35 @@ public class ConfigurationPropertiesReportEndpointParentTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public TestProperties testProperties() {
|
public TestProperties someProperties() {
|
||||||
return new TestProperties();
|
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")
|
@ConfigurationProperties(prefix = "test")
|
||||||
public static class TestProperties {
|
public static class TestProperties {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ import javax.sql.DataSource;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData;
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
|
||||||
|
|
@ -78,11 +77,8 @@ public class ConfigurationPropertiesReportEndpointProxyTests {
|
||||||
public static class Config {
|
public static class Config {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ConfigurationPropertiesReportEndpoint endpoint(
|
public ConfigurationPropertiesReportEndpoint endpoint() {
|
||||||
ConfigurationBeanFactoryMetaData beanFactoryMetaData) {
|
return new ConfigurationPropertiesReportEndpoint();
|
||||||
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
|
|
||||||
endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData);
|
|
||||||
return endpoint;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,6 @@ import java.util.Map;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetaData;
|
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.boot.test.EnvironmentTestUtils;
|
import org.springframework.boot.test.EnvironmentTestUtils;
|
||||||
|
|
@ -238,10 +237,8 @@ public class ConfigurationPropertiesReportEndpointSerializationTests {
|
||||||
public static class Base {
|
public static class Base {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ConfigurationPropertiesReportEndpoint endpoint(
|
public ConfigurationPropertiesReportEndpoint endpoint() {
|
||||||
ConfigurationBeanFactoryMetaData beanFactoryMetaData) {
|
|
||||||
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
|
ConfigurationPropertiesReportEndpoint endpoint = new ConfigurationPropertiesReportEndpoint();
|
||||||
endpoint.setConfigurationBeanFactoryMetaData(beanFactoryMetaData);
|
|
||||||
endpoint.setMetadataLocations("classpath*:/test-metadata.json");
|
endpoint.setMetadataLocations("classpath*:/test-metadata.json");
|
||||||
return endpoint;
|
return endpoint;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue