Merge pull request #13214 from eddumelendez:gh-13176

* pr/13214:
  Polish "Add support to set visibility via JacksonProperties"
  Add support to set visibility via JacksonProperties
This commit is contained in:
Stephane Nicoll 2018-06-05 10:31:53 +02:00
commit df469abdb0
4 changed files with 47 additions and 0 deletions

View File

@ -27,7 +27,9 @@ import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
@ -73,6 +75,7 @@ import org.springframework.util.ReflectionUtils;
* @author Sebastien Deleuze
* @author Johannes Edmeier
* @author Phillip Webb
* @author Eddú Meléndez
* @since 1.1.0
*/
@Configuration
@ -240,6 +243,7 @@ public class JacksonAutoConfiguration {
builder.timeZone(this.jacksonProperties.getTimeZone());
}
configureFeatures(builder, FEATURE_DEFAULTS);
configureVisibility(builder, this.jacksonProperties.getVisibility());
configureFeatures(builder, this.jacksonProperties.getDeserialization());
configureFeatures(builder, this.jacksonProperties.getSerialization());
configureFeatures(builder, this.jacksonProperties.getMapper());
@ -265,6 +269,11 @@ public class JacksonAutoConfiguration {
});
}
private void configureVisibility(Jackson2ObjectMapperBuilder builder,
Map<PropertyAccessor, JsonAutoDetect.Visibility> accessors) {
accessors.forEach(builder::visibility);
}
private void configureDateFormat(Jackson2ObjectMapperBuilder builder) {
// We support a fully qualified class name extending DateFormat or a date
// pattern string value

View File

@ -21,7 +21,9 @@ import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
@ -59,6 +61,13 @@ public class JacksonProperties {
*/
private String propertyNamingStrategy;
/**
* Jackson visibility thresholds that can be used to limit which methods (and fields)
* are auto-detected.
*/
private Map<PropertyAccessor, JsonAutoDetect.Visibility> visibility = new EnumMap<>(
PropertyAccessor.class);
/**
* Jackson on/off features that affect the way Java objects are serialized.
*/
@ -129,6 +138,10 @@ public class JacksonProperties {
this.propertyNamingStrategy = propertyNamingStrategy;
}
public Map<PropertyAccessor, JsonAutoDetect.Visibility> getVisibility() {
return this.visibility;
}
public Map<SerializationFeature, Boolean> getSerialization() {
return this.serialization;
}

View File

@ -459,6 +459,18 @@ public class JacksonAutoConfigurationTests {
});
}
@Test
public void writeWithVisibility() {
this.contextRunner.withPropertyValues("spring.jackson.visibility.getter:none",
"spring.jackson.visibility.field:any").run((context) -> {
ObjectMapper mapper = context.getBean(ObjectMapper.class);
String json = mapper.writeValueAsString(new VisibilityBean());
assertThat(json).contains("property1");
assertThat(json).contains("property2");
assertThat(json).doesNotContain("property3");
});
}
private void assertParameterNamesModuleCreatorBinding(Mode expectedMode,
Class<?>... configClasses) {
this.contextRunner.withUserConfiguration(configClasses).run((context) -> {
@ -614,4 +626,16 @@ public class JacksonAutoConfigurationTests {
}
private static class VisibilityBean {
private String property1;
public String property2;
public String getProperty3() {
return null;
}
}
}

View File

@ -340,6 +340,7 @@ content into your application. Rather, pick only the properties that you need.
spring.jackson.property-naming-strategy= # One of the constants on Jackson's PropertyNamingStrategy. Can also be a fully-qualified class name of a PropertyNamingStrategy subclass.
spring.jackson.serialization.*= # Jackson on/off features that affect the way Java objects are serialized.
spring.jackson.time-zone= # Time zone used when formatting dates. For instance, "America/Los_Angeles" or "GMT+10".
spring.jackson.visibility.*= # Jackson visibility thresholds that can be used to limit which methods (and fields) are auto-detected.
# GSON ({sc-spring-boot-autoconfigure}/gson/GsonProperties.{sc-ext}[GsonProperties])
spring.gson.date-format= # Format to use when serializing Date objects.