From 9bbd08c6a8297334ed8f2092b7a30d505202c5dc Mon Sep 17 00:00:00 2001 From: sam-gardner <53271849+sam-gardner@users.noreply.github.com> Date: Mon, 19 Jun 2023 16:15:16 +0100 Subject: [PATCH] BAEL-5830 Add code for setting default values for null fields with Jackson (#14265) --- .../defaultvalues/JsonSetterDefaultValue.java | 30 +++++++++++++++ .../NonAnnotatedDefaultValue.java | 20 ++++++++++ .../defaultvalues/NullsSkipDefaultValue.java | 27 ++++++++++++++ .../defaultvalues/DefaultValuesUnitTest.java | 37 +++++++++++++++++++ 4 files changed, 114 insertions(+) create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java create mode 100644 jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java create mode 100644 jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java new file mode 100644 index 0000000000..5d8c758e86 --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/JsonSetterDefaultValue.java @@ -0,0 +1,30 @@ +package com.baeldung.jackson.defaultvalues; + +import com.fasterxml.jackson.annotation.JsonSetter; + +public class JsonSetterDefaultValue { + + private String required; + private String optional = "valueIfMissingEntirely"; + + @JsonSetter("optional") + public void setOptional(String optional){ + if(optional == null){ + this.optional = "valueIfNull"; + } + } + + public String getRequired() { + return required; + } + + public String getOptional() { + return optional; + } + + @Override + public String toString() { + return "NonAnnotatedDefaultValue{" + "required='" + required + '\'' + ", optional='" + optional + '\'' + '}'; + } + +} diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java new file mode 100644 index 0000000000..54747642ef --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NonAnnotatedDefaultValue.java @@ -0,0 +1,20 @@ +package com.baeldung.jackson.defaultvalues; + +public class NonAnnotatedDefaultValue { + + private String required; + private String optional = "defaultValue"; + + public String getRequired() { + return required; + } + + public String getOptional() { + return optional; + } + + @Override + public String toString() { + return "NonAnnotatedDefaultValue{" + "required='" + required + '\'' + ", optional='" + optional + '\'' + '}'; + } +} diff --git a/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java new file mode 100644 index 0000000000..8dc585ea30 --- /dev/null +++ b/jackson-modules/jackson-core/src/main/java/com/baeldung/jackson/defaultvalues/NullsSkipDefaultValue.java @@ -0,0 +1,27 @@ +package com.baeldung.jackson.defaultvalues; + +import com.fasterxml.jackson.annotation.JsonSetter; +import com.fasterxml.jackson.annotation.Nulls; + +public class NullsSkipDefaultValue { + + private String required; + @JsonSetter(nulls = Nulls.SKIP) + private String optional = "defaultValue"; + + public void setOptional(String optional){} + + public String getRequired() { + return required; + } + + public String getOptional() { + return optional; + } + + @Override + public String toString() { + return "NonAnnotatedDefaultValue{" + "required='" + required + '\'' + ", optional='" + optional + '\'' + '}'; + } + +} diff --git a/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java new file mode 100644 index 0000000000..813cfaae16 --- /dev/null +++ b/jackson-modules/jackson-core/src/test/java/com/baeldung/jackson/defaultvalues/DefaultValuesUnitTest.java @@ -0,0 +1,37 @@ +package com.baeldung.jackson.defaultvalues; + +import org.junit.Test; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DefaultValuesUnitTest { + + @Test + public void givenAClassWithADefaultValue_whenReadingJsonWithoutOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException { + String noOptionalField = "{\"required\": \"value\"}"; + ObjectMapper objectMapper = new ObjectMapper(); + NonAnnotatedDefaultValue createdObject = objectMapper.readValue(noOptionalField, NonAnnotatedDefaultValue.class); + assert(createdObject.getRequired()).equals("value"); + assert(createdObject.getOptional()).equals("defaultValue"); + } + + @Test + public void givenAClassWithAJsonSetter_whenReadingJsonWithNullOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException { + String nullOptionalField = "{\"required\": \"value\", \"optional\": null}"; + ObjectMapper objectMapper = new ObjectMapper(); + JsonSetterDefaultValue createdObject = objectMapper.readValue(nullOptionalField, JsonSetterDefaultValue.class); + assert(createdObject.getRequired()).equals("value"); + assert(createdObject.getOptional()).equals("valueIfNull"); + } + + @Test + public void givenAClassWithAJsonSetterNullsSkip_whenReadingJsonWithNullOptionalValue_thenExpectDefaultValueInResult() throws JsonProcessingException { + String nullOptionalField = "{\"required\": \"value\", \"optional\": null}"; + ObjectMapper objectMapper = new ObjectMapper(); + NullsSkipDefaultValue createdObject = objectMapper.readValue(nullOptionalField, NullsSkipDefaultValue.class); + assert(createdObject.getRequired()).equals("value"); + assert(createdObject.getOptional()).equals("defaultValue"); + } + +}