diff --git a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactoryTest.java b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactoryTest.java index 8fc97f2b..2b5b7b82 100644 --- a/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactoryTest.java +++ b/aws-lambda-java-runtime-interface-client/src/test/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactoryTest.java @@ -2,17 +2,55 @@ package com.amazonaws.services.lambda.runtime.serialization.factories; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import java.util.Optional; + +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; public class JacksonFactoryTest { + private JacksonFactory jacksonFactory = JacksonFactory.getInstance(); + private ObjectMapper mapper = jacksonFactory.getMapper(); + @Test public void deserializeVoidAsNonNull() throws Exception { - JacksonFactory instance = JacksonFactory.getInstance(); - Void actual = instance.getMapper().readValue("{}", Void.class); + Void actual = mapper.readValue("{}", Void.class); assertNotNull(actual); } + @Test + public void testOptionalAsEmpty() throws JsonProcessingException { + Contact emptyEmail = new Contact("Example Co.", Optional.empty()); + String emptyEmailJson = mapper.writeValueAsString(emptyEmail); + assertEquals("{\"name\":\"Example Co.\",\"email\":null}", emptyEmailJson); + } + + @Test + public void testOptionalWithValue() throws JsonProcessingException { + Contact withEmail = new Contact("Example Co.", Optional.of("info@example.com")); + String withEmailJson = mapper.writeValueAsString(withEmail); + assertEquals("{\"name\":\"Example Co.\",\"email\":\"info@example.com\"}", withEmailJson); + } + + static class Contact { + private final String name; + private final Optional email; + + public Contact(String name, Optional email) { + this.name = name; + this.email = email; + } + + public String getName() { + return name; + } + + public Optional getEmail() { + return email; + } + } } diff --git a/aws-lambda-java-serialization/pom.xml b/aws-lambda-java-serialization/pom.xml index e3892d6c..8e1c11ff 100644 --- a/aws-lambda-java-serialization/pom.xml +++ b/aws-lambda-java-serialization/pom.xml @@ -32,6 +32,7 @@ 1.8 1.8 com.amazonaws.lambda.thirdparty + 2.10.0 @@ -39,8 +40,14 @@ com.fasterxml.jackson.core jackson-databind - 2.10.0 + ${jackson.version} + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + ${jackson.version} + + com.google.code.gson gson diff --git a/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactory.java b/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactory.java index 7fccd2a5..d96d5196 100644 --- a/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactory.java +++ b/aws-lambda-java-serialization/src/main/java/com/amazonaws/services/lambda/runtime/serialization/factories/JacksonFactory.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.SerializationConfig; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import java.io.IOException; import java.io.OutputStream; @@ -112,6 +113,7 @@ private static ObjectMapper createObjectMapper() { SimpleModule module = new SimpleModule(); module.addDeserializer(Void.class, new VoidDeserializer()); mapper.registerModule(module); + mapper.registerModule(new Jdk8Module()); return mapper; }