From 7346c85f95379d243802cd45ad7d42a541130a00 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Tue, 30 Jul 2019 23:01:58 +0200 Subject: [PATCH] fix: DateTime serializer --- build.gradle.kts | 1 + .../fr/postgresjson/serializer/Serializer.kt | 10 +++++---- .../kotlin/fr/postgresjson/SerializerTest.kt | 21 +++++++++++++++++-- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 172817a..6f37a7e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,6 +17,7 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.jetbrains.kotlin:kotlin-reflect:1.3.31") implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.9.9") + implementation("com.fasterxml.jackson.datatype:jackson-datatype-joda:2.9.9") implementation("com.github.jasync-sql:jasync-postgresql:0.9.53") implementation("org.slf4j:slf4j-api:1.7.26") diff --git a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt index a1d4aa7..ebbd11d 100644 --- a/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt +++ b/src/main/kotlin/fr/postgresjson/serializer/Serializer.kt @@ -3,12 +3,10 @@ package fr.postgresjson.serializer import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.core.JsonProcessingException import com.fasterxml.jackson.core.type.TypeReference -import com.fasterxml.jackson.databind.DeserializationContext -import com.fasterxml.jackson.databind.JsonNode -import com.fasterxml.jackson.databind.ObjectMapper -import com.fasterxml.jackson.databind.PropertyNamingStrategy +import com.fasterxml.jackson.databind.* import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.datatype.joda.JodaModule import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.readValue import fr.postgresjson.entity.EntitiesCollections @@ -28,6 +26,10 @@ class Serializer(val mapper: ObjectMapper = jacksonObjectMapper()) { module.addDeserializer(IdEntity::class.java, EntityIdDeserializer(collection)) mapper.registerModule(module) mapper.propertyNamingStrategy = PropertyNamingStrategy.SNAKE_CASE + + mapper.registerModule(JodaModule()) + mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS) + mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); } fun serialize(source: EntityI): String { diff --git a/src/test/kotlin/fr/postgresjson/SerializerTest.kt b/src/test/kotlin/fr/postgresjson/SerializerTest.kt index 4995783..5e7914c 100644 --- a/src/test/kotlin/fr/postgresjson/SerializerTest.kt +++ b/src/test/kotlin/fr/postgresjson/SerializerTest.kt @@ -4,6 +4,7 @@ import fr.postgresjson.entity.IdEntity import fr.postgresjson.serializer.Serializer import fr.postgresjson.serializer.deserialize import fr.postgresjson.serializer.serialize +import org.joda.time.DateTime import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.BeforeEach @@ -13,10 +14,12 @@ import org.junit.jupiter.api.TestInstance @TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class SerializerTest: TestAbstract() { private class ObjTest(var val1: String, var val2: Int) : IdEntity(1) + private class ObjTestDate(var val1: DateTime) : IdEntity(2) private val serializer = Serializer() private val objSerialized: String = """{"val1":"plop","val2":123,"id":2}""" + private val objSerializedWithExtra: String = """{"val1":"plop","val2":123,"id":2,"toto":"tata"}""" private val objSerializedUpdate = """{"val1":"update","val2":123}""" private lateinit var obj: ObjTest @@ -29,13 +32,20 @@ internal class SerializerTest: TestAbstract() { @Test fun serialize() { val json = serializer.serialize(obj) - assertTrue(json.contains("\"val1\":\"plop\",\"val2\":123")) + assertTrue(json.contains(""""val1":"plop","val2":123""")) } @Test fun serialize2() { val json = obj.serialize() - assertTrue(json.contains("\"val1\":\"plop\",\"val2\":123")) + assertTrue(json.contains(""""val1":"plop","val2":123""")) + } + + @Test + fun serializeDate() { + val objDate = ObjTestDate(DateTime.parse("2019-07-30T14:08:51.420108+04:00")) + val json = objDate.serialize() + assertTrue(json.contains(""""val1":"2019-07-30T10:08:51.420Z""""), json) } @Test @@ -45,6 +55,13 @@ internal class SerializerTest: TestAbstract() { assertEquals(obj.val2, objDeserialized.val2) } + @Test + fun deserializeWhitExtraField() { + val objDeserialized = serializer.deserialize(objSerializedWithExtra) + assertEquals(obj.val1, objDeserialized.val1) + assertEquals(obj.val2, objDeserialized.val2) + } + @Test fun deserializeUpdate() { val objDeserialized: ObjTest = serializer.deserialize(objSerializedUpdate, obj)