From 161fa3ece4fc66e8f018b8e7271e7a8677e6a443 Mon Sep 17 00:00:00 2001 From: David Dellsperger Date: Wed, 4 Aug 2021 16:00:53 -0500 Subject: [PATCH 1/2] Add support to set a setting to serialize null values using the DefaultSerializer and GSONFactory --- .../graph/serializer/DefaultSerializer.java | 15 ++++++++-- .../graph/serializer/GsonFactory.java | 17 ++++++++++- .../serializer/DefaultSerializerTest.java | 30 +++++++++++++++++++ 3 files changed, 59 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java index 3ea6cf36d..328799db1 100644 --- a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java +++ b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java @@ -65,10 +65,21 @@ public class DefaultSerializer implements ISerializer { * @param logger the logger */ public DefaultSerializer(@Nonnull final ILogger logger) { - this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null"); - this.gson = GsonFactory.getGsonInstance(logger); + this(false, logger); } + + /** + * Creates a DefaultSerializer with an option to enable serializing of the null values. + * + * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object + * @param logger the logger + */ + public DefaultSerializer(@Nonnull final boolean serializeNulls, @Nonnull final ILogger logger) { + this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null"); + this.gson = GsonFactory.getGsonInstance(serializeNulls, logger); + } + @Override @Nullable public T deserializeObject(@Nonnull final String inputString, @Nonnull final Class clazz, @Nullable final Map> responseHeaders) { diff --git a/src/main/java/com/microsoft/graph/serializer/GsonFactory.java b/src/main/java/com/microsoft/graph/serializer/GsonFactory.java index 1b24e1c08..841f8f378 100644 --- a/src/main/java/com/microsoft/graph/serializer/GsonFactory.java +++ b/src/main/java/com/microsoft/graph/serializer/GsonFactory.java @@ -69,6 +69,17 @@ private GsonFactory() { * @return the new instance */ public static Gson getGsonInstance(final ILogger logger) { + return getGsonInstance(false, logger); + } + + /** + * Creates an instance of GSON + * + * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object + * @param logger the logger + * @return the new instance + */ + public static Gson getGsonInstance(final boolean serializeNulls, final ILogger logger) { final JsonSerializer calendarJsonSerializer = new JsonSerializer() { @Override @@ -328,7 +339,11 @@ public Float deserialize(final JsonElement json, } }; - return new GsonBuilder() + GsonBuilder builder = new GsonBuilder(); + if(serializeNulls) { + builder.serializeNulls(); + } + return builder .excludeFieldsWithoutExposeAnnotation() .registerTypeAdapter(Boolean.class, booleanJsonDeserializer) .registerTypeAdapter(String.class, stringJsonDeserializer) diff --git a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java index 459e9b14a..533015059 100644 --- a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java +++ b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java @@ -3,6 +3,7 @@ import com.google.gson.Gson; import com.google.gson.JsonElement; import com.microsoft.graph.logger.ILogger; +import com.microsoft.graph.models.MessageStub; import com.microsoft.graph.models.ReactionStub; import com.microsoft.graph.models.SubReactionStub1; import org.junit.jupiter.api.Test; @@ -17,6 +18,7 @@ public class DefaultSerializerTest { final ILogger logger = mock(ILogger.class); Gson gson = GsonFactory.getGsonInstance(logger); DefaultSerializer defaultSerializer = new DefaultSerializer(logger); + DefaultSerializer defaultNullSerializer = new DefaultSerializer(true, logger); @Test public void testDeserializationOfObjectWithODataTypeProperty() { @@ -33,4 +35,32 @@ public void testDeserializationOfObjectWithODataTypeProperty() { Mockito.verify(reaction.additionalDataManager()).setAdditionalData(gson.fromJson(testJsonResponse, JsonElement.class).getAsJsonObject()); } + @Test + public void testDefaultSerializerDoesNotIncludeNullValuesByDefault() { + // Given + final String testJsonResponse = + "{\"@odata.type\": \"#microsoft.graph.messageStub\", \"body\": null}"; + + // When + DefaultSerializer nonNullSerializer = new DefaultSerializer(logger); + MessageStub message = nonNullSerializer.deserializeObject(testJsonResponse, MessageStub.class); + + // Then + assertEquals("{}", nonNullSerializer.serializeObject(message)); + } + + @Test + public void testDefaultNullSerializerDoesIncludeNullValues() { + // Given + final String testJsonResponse = + "{\"@odata.type\": \"#microsoft.graph.messageStub\",\"body\":null}"; + + // When + DefaultSerializer nullSerializer = new DefaultSerializer(true, logger); + MessageStub message = nullSerializer.deserializeObject(testJsonResponse, MessageStub.class); + + // Then + assertEquals("{\"body\":null,\"reaction\":null}", nullSerializer.serializeObject(message)); + } + } From d7725678e4789d8305cf4243ab3bd401cc09b061 Mon Sep 17 00:00:00 2001 From: David Dellsperger Date: Thu, 5 Aug 2021 09:20:53 -0500 Subject: [PATCH 2/2] Updated based on PR feedback --- .../graph/serializer/DefaultSerializer.java | 8 ++++---- .../microsoft/graph/serializer/GsonFactory.java | 16 ++++++++++------ .../graph/serializer/DefaultSerializerTest.java | 13 +++++++------ 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java index 328799db1..5b510482d 100644 --- a/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java +++ b/src/main/java/com/microsoft/graph/serializer/DefaultSerializer.java @@ -65,19 +65,19 @@ public class DefaultSerializer implements ISerializer { * @param logger the logger */ public DefaultSerializer(@Nonnull final ILogger logger) { - this(false, logger); + this(logger, false); } /** * Creates a DefaultSerializer with an option to enable serializing of the null values. * - * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object * @param logger the logger + * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object */ - public DefaultSerializer(@Nonnull final boolean serializeNulls, @Nonnull final ILogger logger) { + public DefaultSerializer(@Nonnull final ILogger logger, @Nonnull final boolean serializeNulls) { this.logger = Objects.requireNonNull(logger, "parameter logger cannot be null"); - this.gson = GsonFactory.getGsonInstance(serializeNulls, logger); + this.gson = GsonFactory.getGsonInstance(logger, serializeNulls); } @Override diff --git a/src/main/java/com/microsoft/graph/serializer/GsonFactory.java b/src/main/java/com/microsoft/graph/serializer/GsonFactory.java index 841f8f378..645766f55 100644 --- a/src/main/java/com/microsoft/graph/serializer/GsonFactory.java +++ b/src/main/java/com/microsoft/graph/serializer/GsonFactory.java @@ -44,8 +44,10 @@ import java.util.Arrays; import java.util.EnumSet; import java.util.GregorianCalendar; +import java.util.Objects; import java.util.UUID; +import javax.annotation.Nonnull; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; @@ -68,19 +70,21 @@ private GsonFactory() { * @param logger the logger * @return the new instance */ - public static Gson getGsonInstance(final ILogger logger) { - return getGsonInstance(false, logger); + @Nonnull + public static Gson getGsonInstance(@Nonnull final ILogger logger) { + return getGsonInstance(logger, false); } /** * Creates an instance of GSON * - * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object * @param logger the logger + * @param serializeNulls the setting of whether or not to serialize the null values in the JSON object * @return the new instance */ - public static Gson getGsonInstance(final boolean serializeNulls, final ILogger logger) { - + @Nonnull + public static Gson getGsonInstance(@Nonnull final ILogger logger, final boolean serializeNulls) { + Objects.requireNonNull(logger, "parameter logger cannot be null"); final JsonSerializer calendarJsonSerializer = new JsonSerializer() { @Override public JsonElement serialize(final OffsetDateTime src, @@ -340,7 +344,7 @@ public Float deserialize(final JsonElement json, }; GsonBuilder builder = new GsonBuilder(); - if(serializeNulls) { + if (serializeNulls) { builder.serializeNulls(); } return builder diff --git a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java index 533015059..de269d613 100644 --- a/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java +++ b/src/test/java/com/microsoft/graph/serializer/DefaultSerializerTest.java @@ -10,6 +10,7 @@ import org.mockito.Mockito; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; @@ -18,7 +19,6 @@ public class DefaultSerializerTest { final ILogger logger = mock(ILogger.class); Gson gson = GsonFactory.getGsonInstance(logger); DefaultSerializer defaultSerializer = new DefaultSerializer(logger); - DefaultSerializer defaultNullSerializer = new DefaultSerializer(true, logger); @Test public void testDeserializationOfObjectWithODataTypeProperty() { @@ -42,11 +42,11 @@ public void testDefaultSerializerDoesNotIncludeNullValuesByDefault() { "{\"@odata.type\": \"#microsoft.graph.messageStub\", \"body\": null}"; // When - DefaultSerializer nonNullSerializer = new DefaultSerializer(logger); - MessageStub message = nonNullSerializer.deserializeObject(testJsonResponse, MessageStub.class); + final MessageStub message = defaultSerializer.deserializeObject(testJsonResponse, MessageStub.class); // Then - assertEquals("{}", nonNullSerializer.serializeObject(message)); + assertNotNull(message); + assertEquals("{}", defaultSerializer.serializeObject(message)); } @Test @@ -56,10 +56,11 @@ public void testDefaultNullSerializerDoesIncludeNullValues() { "{\"@odata.type\": \"#microsoft.graph.messageStub\",\"body\":null}"; // When - DefaultSerializer nullSerializer = new DefaultSerializer(true, logger); - MessageStub message = nullSerializer.deserializeObject(testJsonResponse, MessageStub.class); + final DefaultSerializer nullSerializer = new DefaultSerializer(logger, true); + final MessageStub message = nullSerializer.deserializeObject(testJsonResponse, MessageStub.class); // Then + assertNotNull(message); assertEquals("{\"body\":null,\"reaction\":null}", nullSerializer.serializeObject(message)); }