Browse Source

Allow configprops endpoint stringify primitive wrappers

Update `ConfigurationPropertiesReportEndpoint` so that primitive
wrapper input values in the Environment are stringified for display.

Fixes gh-36076
pull/36620/head
Phillip Webb 3 years ago
parent
commit
51ee702dac
  1. 2
      spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/context/properties/ConfigurationPropertiesReportEndpoint.java
  2. 28
      spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/context/properties/ConfigurationPropertiesReportEndpointTests.java

2
spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/context/properties/ConfigurationPropertiesReportEndpoint.java

@ -394,7 +394,7 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext @@ -394,7 +394,7 @@ public class ConfigurationPropertiesReportEndpoint implements ApplicationContext
}
private Object stringifyIfNecessary(Object value) {
if (value == null || value.getClass().isPrimitive()) {
if (value == null || ClassUtils.isPrimitiveOrWrapper(value.getClass()) || value instanceof String) {
return value;
}
if (CharSequence.class.isAssignableFrom(value.getClass())) {

28
spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/context/properties/ConfigurationPropertiesReportEndpointTests.java

@ -44,7 +44,10 @@ import org.springframework.boot.test.context.runner.ContextConsumer; @@ -44,7 +44,10 @@ import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.Environment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.PropertySource;
import org.springframework.mock.env.MockPropertySource;
import org.springframework.util.unit.DataSize;
@ -143,6 +146,21 @@ class ConfigurationPropertiesReportEndpointTests { @@ -143,6 +146,21 @@ class ConfigurationPropertiesReportEndpointTests {
.isEqualTo(Duration.ofSeconds(10).toString())));
}
@Test // gh-36076
void descriptorWithWrapperProperty() {
this.contextRunner.withUserConfiguration(TestPropertiesConfiguration.class).withInitializer((context) -> {
ConfigurableEnvironment environment = context.getEnvironment();
Map<String, Object> map = Collections.singletonMap("test.wrapper", 10);
PropertySource<?> propertySource = new MapPropertySource("test", map);
environment.getPropertySources().addLast(propertySource);
})
.run(assertProperties("test", (properties) -> assertThat(properties.get("wrapper")).isEqualTo(10),
(inputs) -> {
Map<String, Object> wrapper = (Map<String, Object>) inputs.get("wrapper");
assertThat(wrapper.get("value")).isEqualTo(10);
}));
}
@Test
void descriptorWithNonCamelCaseProperty() {
this.contextRunner.withUserConfiguration(MixedCasePropertiesConfiguration.class)
@ -476,6 +494,8 @@ class ConfigurationPropertiesReportEndpointTests { @@ -476,6 +494,8 @@ class ConfigurationPropertiesReportEndpointTests {
private String ignored = "dummy";
private Integer wrapper;
public String getDbPassword() {
return this.dbPassword;
}
@ -512,6 +532,14 @@ class ConfigurationPropertiesReportEndpointTests { @@ -512,6 +532,14 @@ class ConfigurationPropertiesReportEndpointTests {
return this.ignored;
}
public Integer getWrapper() {
return this.wrapper;
}
public void setWrapper(Integer wrapper) {
this.wrapper = wrapper;
}
}
@Configuration(proxyBeanMethods = false)

Loading…
Cancel
Save