반응형
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()) }
}
반응형
'개발 > Spring' 카테고리의 다른 글
[Spring Batch] Chunk 기반의 Job 은 어떤 기준으로 작업을 끝낼까 ? (0) | 2021.12.29 |
---|---|
MongoDB 여러개의 Document 한번에 insert 하기 (0) | 2021.08.22 |
[Spring] Kotlin 을 이용하여 MongoDB Query를 Type-safe 하게 작성하기 (0) | 2021.07.30 |
[Spring] Interceptor postHandle이 동작을 안해요. (1) | 2021.07.02 |
[ReactiveCrudRepository] 데이터 삭제가 안되는 이슈 (0) | 2021.05.07 |
댓글