Skip to content

Commit ce70a97

Browse files
committed
Add DataSize serializer for configprops endpoint
Closes gh-32613
1 parent 1e886bd commit ce70a97

File tree

2 files changed

+51
-1
lines changed

2 files changed

+51
-1
lines changed

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

+16-1
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,15 @@
4141
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
4242
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
4343
import com.fasterxml.jackson.databind.json.JsonMapper;
44+
import com.fasterxml.jackson.databind.module.SimpleModule;
4445
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
4546
import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
4647
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
4748
import com.fasterxml.jackson.databind.ser.PropertyWriter;
4849
import com.fasterxml.jackson.databind.ser.SerializerFactory;
4950
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
5051
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
52+
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
5153
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
5254
import org.apache.commons.logging.Log;
5355
import org.apache.commons.logging.LogFactory;
@@ -80,6 +82,7 @@
8082
import org.springframework.core.env.PropertySource;
8183
import org.springframework.util.ClassUtils;
8284
import org.springframework.util.StringUtils;
85+
import org.springframework.util.unit.DataSize;
8386

8487
/**
8588
* {@link Endpoint @Endpoint} to expose application properties from
@@ -188,12 +191,12 @@ protected void configureJsonMapper(JsonMapper.Builder builder) {
188191
builder.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
189192
builder.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
190193
builder.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);
191-
JsonMapper.builder();
192194
builder.configure(MapperFeature.USE_STD_BEAN_NAMING, true);
193195
builder.serializationInclusion(Include.NON_NULL);
194196
applyConfigurationPropertiesFilter(builder);
195197
applySerializationModifier(builder);
196198
builder.addModule(new JavaTimeModule());
199+
builder.addModule(new ConfigurationPropertiesModule());
197200
}
198201

199202
private void applyConfigurationPropertiesFilter(JsonMapper.Builder builder) {
@@ -474,6 +477,18 @@ public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider
474477

475478
}
476479

480+
/**
481+
* {@link SimpleModule} for configure the serializer.
482+
*/
483+
private static final class ConfigurationPropertiesModule extends SimpleModule {
484+
485+
private ConfigurationPropertiesModule() {
486+
super();
487+
addSerializer(DataSize.class, ToStringSerializer.instance);
488+
}
489+
490+
}
491+
477492
/**
478493
* {@link BeanSerializerModifier} to return only relevant configuration properties.
479494
*/

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

+35
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import org.springframework.context.annotation.Configuration;
4747
import org.springframework.core.env.Environment;
4848
import org.springframework.mock.env.MockPropertySource;
49+
import org.springframework.util.unit.DataSize;
4950

5051
import static org.assertj.core.api.Assertions.assertThat;
5152
import static org.assertj.core.api.Assertions.entry;
@@ -168,6 +169,19 @@ void descriptorWithMixedBooleanProperty() {
168169
(properties) -> assertThat(properties.get("mixedBoolean")).isEqualTo(true)));
169170
}
170171

172+
@Test
173+
void descriptorWithDataSizeProperty() {
174+
String configSize = "1MB";
175+
String stringifySize = DataSize.parse(configSize).toString();
176+
this.contextRunner.withUserConfiguration(DataSizePropertiesConfiguration.class)
177+
.withPropertyValues(String.format("data.size=%s", configSize)).run(assertProperties("data",
178+
(properties) -> assertThat(properties.get("size")).isEqualTo(stringifySize), (inputs) -> {
179+
Map<String, Object> size = (Map<String, Object>) inputs.get("size");
180+
assertThat(size.get("value")).isEqualTo(configSize);
181+
assertThat(size.get("origin")).isEqualTo("\"data.size\" from property source \"test\"");
182+
}));
183+
}
184+
171185
@Test
172186
void sanitizeWithDefaultSettings() {
173187
this.contextRunner.withUserConfiguration(TestPropertiesConfiguration.class)
@@ -690,6 +704,27 @@ public void setMixedBoolean(Boolean mixedBoolean) {
690704

691705
}
692706

707+
@Configuration(proxyBeanMethods = false)
708+
@EnableConfigurationProperties(DataSizeProperties.class)
709+
static class DataSizePropertiesConfiguration {
710+
711+
}
712+
713+
@ConfigurationProperties("data")
714+
public static class DataSizeProperties {
715+
716+
private DataSize size;
717+
718+
public DataSize getSize() {
719+
return this.size;
720+
}
721+
722+
public void setSize(DataSize size) {
723+
this.size = size;
724+
}
725+
726+
}
727+
693728
@Configuration(proxyBeanMethods = false)
694729
@EnableConfigurationProperties(Gh4415Properties.class)
695730
static class Gh4415PropertiesConfiguration {

0 commit comments

Comments
 (0)