Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Actuator configprops endpoint does not display DataSize properties correctly #32645

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -41,13 +41,15 @@
import com.fasterxml.jackson.databind.introspect.AnnotatedMethod;
import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector;
import com.fasterxml.jackson.databind.json.JsonMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;
import com.fasterxml.jackson.databind.ser.BeanSerializerFactory;
import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.SerializerFactory;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
Expand Down Expand Up @@ -80,6 +82,7 @@
import org.springframework.core.env.PropertySource;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;
import org.springframework.util.unit.DataSize;

/**
* {@link Endpoint @Endpoint} to expose application properties from
Expand Down Expand Up @@ -188,12 +191,12 @@ protected void configureJsonMapper(JsonMapper.Builder builder) {
builder.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
builder.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
builder.configure(SerializationFeature.WRITE_DURATIONS_AS_TIMESTAMPS, false);
JsonMapper.builder();
builder.configure(MapperFeature.USE_STD_BEAN_NAMING, true);
builder.serializationInclusion(Include.NON_NULL);
applyConfigurationPropertiesFilter(builder);
applySerializationModifier(builder);
builder.addModule(new JavaTimeModule());
builder.addModule(new ConfigurationPropertiesModule());
}

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

}

/**
* {@link SimpleModule} for configure the serializer.
*/
private static final class ConfigurationPropertiesModule extends SimpleModule {

private ConfigurationPropertiesModule() {
super();
addSerializer(DataSize.class, ToStringSerializer.instance);
}

}

/**
* {@link BeanSerializerModifier} to return only relevant configuration properties.
*/
Expand Down
Expand Up @@ -46,6 +46,7 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.mock.env.MockPropertySource;
import org.springframework.util.unit.DataSize;

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

@Test
void descriptorWithDataSizeProperty() {
String configSize = "1MB";
String stringifySize = DataSize.parse(configSize).toString();
this.contextRunner.withUserConfiguration(DataSizePropertiesConfiguration.class)
.withPropertyValues(String.format("data.size=%s", configSize)).run(assertProperties("data",
(properties) -> assertThat(properties.get("size")).isEqualTo(stringifySize), (inputs) -> {
Map<String, Object> size = (Map<String, Object>) inputs.get("size");
assertThat(size.get("value")).isEqualTo(configSize);
assertThat(size.get("origin")).isEqualTo("\"data.size\" from property source \"test\"");
}));
}

@Test
void sanitizeWithDefaultSettings() {
this.contextRunner.withUserConfiguration(TestPropertiesConfiguration.class)
Expand Down Expand Up @@ -690,6 +704,27 @@ public void setMixedBoolean(Boolean mixedBoolean) {

}

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(DataSizeProperties.class)
static class DataSizePropertiesConfiguration {

}

@ConfigurationProperties("data")
public static class DataSizeProperties {

private DataSize size;

public DataSize getSize() {
return this.size;
}

public void setSize(DataSize size) {
this.size = size;
}

}

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(Gh4415Properties.class)
static class Gh4415PropertiesConfiguration {
Expand Down