본문 바로가기
개발/Spring

nested objectId serialize, deserialize 했을 때 값이 달라지는 이슈 해결하기

by 상용최 2022. 4. 23.
반응형

ObjectId 를 프로퍼티로 가지고 있는 class 를 serialize 한 후 deserialize 하면 값이 달라지는 현상이 일어난다.

class RedisSerializerTest {

    @Test
    fun test() {
				val objectMapper = ObjectMapper()
        val serializer = Jackson2JsonRedisSerializer(ErrorExample::class.java)
            .also { it.setObjectMapper(objectMapper) }

        val id = ObjectId("6239341381210e5903548df7")

        val actual = ErrorExample(id)
        val serialize = serializer.serialize(actual)
        val deserialize = serializer.deserialize(serialize)
        // fail
        assertEquals(actual, deserialize)
    }
}

data class ErrorExample(
    val id: ObjectId
)

ObjectId 를 serialize 하게 되면 아래와 같은 형태를 가지게 된다.

{ "timestamp": , "counter": , "randomValue1": , "randomValue2":  }

 

이 문제를 해결하기 위해서는 ObjectId 를 serialize 할때 String 으로 변환하고 deserialize 할때 변환된 String 으로 ObjectId 를 생성하도록 하면된다.

방법은 아래와 같다.


1. Serializer 생성

class ObjectId2StringSerializer : JsonSerializer<ObjectId?>() {

    override fun serialize(value: ObjectId?, jgen: JsonGenerator, provider: SerializerProvider?) {
        jgen.writeString(value.toString())
    }
}

2. ObjectMapper 에 Module 등록

fun objectMapper(): ObjectMapper {
		val objectMapper = ObjectMapper()
		objectMapper.registerModule(objectId2StringModule())
}

private fun objectId2StringModule(): SimpleModule {
    return SimpleModule("ObjectId2StringModule").also { it.addSerializer(ObjectId::class.java, ObjectId2StringSerializer()) }
}

반응형

댓글