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 fb0af8a63c6..145d3c8759b 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 @@ -17,13 +17,13 @@ package org.springframework.boot.actuate.endpoint; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import com.fasterxml.jackson.databind.BeanDescription; -import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; @@ -58,6 +58,7 @@ import org.springframework.util.StringUtils; * * @author Christian Dupuis * @author Dave Syer + * @author Stephane Nicoll */ @ConfigurationProperties(prefix = "endpoints.configprops") public class ConfigurationPropertiesReportEndpoint @@ -330,17 +331,18 @@ public class ConfigurationPropertiesReportEndpoint private boolean isReadable(BeanDescription beanDesc, BeanPropertyWriter writer) { Class parentType = beanDesc.getType().getRawClass(); - JavaType type = writer.getType(); + Class type = writer.getType().getRawClass(); AnnotatedMethod setter = findSetter(beanDesc, writer); // If there's a setter, we assume it's OK to report on the value, // similarly, if there's no setter but the package names match, we assume // that its a nested class used solely for binding to config props, so it - // should be kosher. This filter is not used if there is JSON metadata for - // the property, so it's mainly for user-defined beans. + // should be kosher. Lists and Maps are also auto-detected by default since + // that's what the metadata generator does. This filter is not used if there + // is JSON metadata for the property, so it's mainly for user-defined beans. return (setter != null) - || ClassUtils.getPackageName(parentType).equals(ClassUtils.getPackageName(type.getRawClass())) - || type.isMapLikeType() - || type.isCollectionLikeType(); + || ClassUtils.getPackageName(parentType).equals(ClassUtils.getPackageName(type)) + || Map.class.isAssignableFrom(type) + || Collection.class.isAssignableFrom(type); } private AnnotatedMethod findSetter(BeanDescription beanDesc, 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 388e30e4373..851410edee8 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 @@ -35,11 +35,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; /** * Tests for {@link ConfigurationPropertiesReportEndpoint} serialization. * * @author Dave Syer + * @author Stephane Nicoll */ public class ConfigurationPropertiesReportEndpointSerializationTests { @@ -199,36 +201,28 @@ public class ConfigurationPropertiesReportEndpointSerializationTests { @Test @SuppressWarnings("unchecked") - public void testOutputAllOnlyGetterProperties() throws Exception { - this.context.register(OnlyGetterPropertiesConfig.class); + public void testInitializedMapAndList() throws Exception { + this.context.register(InitializedMapAndListPropertiesConfig.class); EnvironmentTestUtils.addEnvironment(this.context, "foo.map.entryOne:true", "foo.list[0]:abc"); this.context.refresh(); ConfigurationPropertiesReportEndpoint report = this.context .getBean(ConfigurationPropertiesReportEndpoint.class); Map properties = report.invoke(); + assertThat(properties).containsKeys("foo"); Map nestedProperties = (Map) properties .get("foo"); - assertThat(nestedProperties).isNotNull(); - System.err.println(nestedProperties); + assertThat(nestedProperties).containsOnlyKeys("prefix", "properties"); assertThat(nestedProperties.get("prefix")).isEqualTo("foo"); Map propertiesMap = (Map) nestedProperties .get("properties"); - assertThat(propertiesMap).isNotNull(); - assertThat(propertiesMap).hasSize(4); - String summary = (String) propertiesMap - .get("summary"); - assertThat(summary).isNull(); + assertThat(propertiesMap).containsOnlyKeys("bar", "name", "map", "list"); Map map = (Map) propertiesMap .get("map"); - assertThat(map).isNotNull(); - assertThat(map).hasSize(1); - assertThat(map.get("entryOne")).isEqualTo(true); + assertThat(map).containsOnly(entry("entryOne", true)); List list = (List) propertiesMap .get("list"); - assertThat(list).isNotNull(); - assertThat(list).hasSize(1); - assertThat(list.get(0)).isEqualTo("abc"); + assertThat(list).containsExactly("abc"); } @Configuration @@ -328,12 +322,14 @@ public class ConfigurationPropertiesReportEndpointSerializationTests { @Configuration @Import(Base.class) - public static class OnlyGetterPropertiesConfig { + public static class InitializedMapAndListPropertiesConfig { + @Bean @ConfigurationProperties(prefix = "foo") - public OnlyGetterProperties foo() { - return new OnlyGetterProperties(); + public InitializedMapAndListProperties foo() { + return new InitializedMapAndListProperties(); } + } public static class Foo { @@ -439,9 +435,11 @@ public class ConfigurationPropertiesReportEndpointSerializationTests { } - public static class OnlyGetterProperties extends Foo { - private Map map = new HashMap<>(); - private List list = new ArrayList<>(); + public static class InitializedMapAndListProperties extends Foo { + + private Map map = new HashMap(); + + private List list = new ArrayList(); public Map getMap() { return this.map; @@ -450,6 +448,7 @@ public class ConfigurationPropertiesReportEndpointSerializationTests { public List getList() { return this.list; } + } }