From d796087dfae4f15f1f893f70fd8bb72ceb25098c Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 16 Oct 2023 15:12:01 +0100 Subject: [PATCH] Polish "Add properties for configuring EnumFeature and JsonNodeFeature" See gh-37885 --- .../jackson/JacksonAutoConfiguration.java | 4 +- .../jackson/JacksonProperties.java | 46 +++++++++++-------- ...itional-spring-configuration-metadata.json | 4 ++ .../JacksonAutoConfigurationTests.java | 4 +- .../src/docs/asciidoc/howto/spring-mvc.adoc | 10 +++- 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java index 68cc6f27e0..5410786e43 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration.java @@ -213,8 +213,8 @@ public class JacksonAutoConfiguration { configureFeatures(builder, this.jacksonProperties.getMapper()); configureFeatures(builder, this.jacksonProperties.getParser()); configureFeatures(builder, this.jacksonProperties.getGenerator()); - configureFeatures(builder, this.jacksonProperties.getEnumDatatype()); - configureFeatures(builder, this.jacksonProperties.getJsonNodeDatatype()); + configureFeatures(builder, this.jacksonProperties.getDatatype().getEnum()); + configureFeatures(builder, this.jacksonProperties.getDatatype().getJsonNode()); configureDateFormat(builder); configurePropertyNamingStrategy(builder); configureModules(builder); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java index a886d7a922..fe3a67e028 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jackson/JacksonProperties.java @@ -89,16 +89,6 @@ public class JacksonProperties { */ private final Map generator = new EnumMap<>(JsonGenerator.Feature.class); - /** - * Jackson on/off features for enum types. - */ - private final Map enumDatatype = new EnumMap<>(EnumFeature.class); - - /** - * Jackson on/off features for JsonNode types. - */ - private final Map jsonNodeDatatype = new EnumMap<>(JsonNodeFeature.class); - /** * Controls the inclusion of properties during serialization. Configured with one of * the values in Jackson's JsonInclude.Include enumeration. @@ -127,6 +117,8 @@ public class JacksonProperties { */ private Locale locale; + private final Datatype datatype = new Datatype(); + public String getDateFormat() { return this.dateFormat; } @@ -167,14 +159,6 @@ public class JacksonProperties { return this.generator; } - public Map getEnumDatatype() { - return this.enumDatatype; - } - - public Map getJsonNodeDatatype() { - return this.jsonNodeDatatype; - } - public JsonInclude.Include getDefaultPropertyInclusion() { return this.defaultPropertyInclusion; } @@ -215,6 +199,10 @@ public class JacksonProperties { this.locale = locale; } + public Datatype getDatatype() { + return this.datatype; + } + public enum ConstructorDetectorStrategy { /** @@ -240,4 +228,26 @@ public class JacksonProperties { } + public static class Datatype { + + /** + * Jackson on/off features for enums. + */ + private final Map enumFeatures = new EnumMap<>(EnumFeature.class); + + /** + * Jackson on/off features for JsonNodes. + */ + private final Map jsonNode = new EnumMap<>(JsonNodeFeature.class); + + public Map getEnum() { + return this.enumFeatures; + } + + public Map getJsonNode() { + return this.jsonNode; + } + + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 5f8c301fd2..7d21dfd05e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -1559,6 +1559,10 @@ "name": "spring.jackson.constructor-detector", "defaultValue": "default" }, + { + "name": "spring.jackson.datatype.enum", + "description": "Jackson on/off features for enums." + }, { "name": "spring.jackson.joda-date-time-format", "type": "java.lang.String", diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java index 3528fc8afd..d11ba22e93 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jackson/JacksonAutoConfigurationTests.java @@ -294,7 +294,7 @@ class JacksonAutoConfigurationTests { @Test void enableEnumFeature() { - this.contextRunner.withPropertyValues("spring.jackson.enum-data-type.write_enums_to_lowercase:true") + this.contextRunner.withPropertyValues("spring.jackson.datatype.enum.write-enums-to-lowercase=true") .run((context) -> { ObjectMapper mapper = context.getBean(ObjectMapper.class); assertThat(EnumFeature.WRITE_ENUMS_TO_LOWERCASE.enabledByDefault()).isFalse(); @@ -304,7 +304,7 @@ class JacksonAutoConfigurationTests { @Test void disableJsonNodeFeature() { - this.contextRunner.withPropertyValues("spring.jackson.json-node-data-type.write_null_properties:false") + this.contextRunner.withPropertyValues("spring.jackson.datatype.jsonnode.write-null-properties:false") .run((context) -> { ObjectMapper mapper = context.getBean(ObjectMapper.class); assertThat(JsonNodeFeature.WRITE_NULL_PROPERTIES.enabledByDefault()).isTrue(); diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto/spring-mvc.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto/spring-mvc.adoc index 038d07338e..a5a4911773 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto/spring-mvc.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/howto/spring-mvc.adoc @@ -64,11 +64,19 @@ Spring Boot also has some features to make it easier to customize this behavior. You can configure the `ObjectMapper` and `XmlMapper` instances by using the environment. Jackson provides an extensive suite of on/off features that can be used to configure various aspects of its processing. -These features are described in six enums (in Jackson) that map onto properties in the environment: +These features are described in several enums (in Jackson) that map onto properties in the environment: |=== | Enum | Property | Values +| `com.fasterxml.jackson.databind.cfg.EnumFeature` +| `spring.jackson.datatype.enum.` +| `true`, `false` + +| `com.fasterxml.jackson.databind.cfg.JsonNodeFeature` +| `spring.jackson.datatype.jsonnode.` +| `true`, `false` + | `com.fasterxml.jackson.databind.DeserializationFeature` | `spring.jackson.deserialization.` | `true`, `false`