Я хочу сериализовать и десериализовать объект гибернации с незагруженными прокси.
Я готовлю ObjectMapper
вот так:
var mapper = ObjectMapper()
mapper.configure(MapperFeature.USE_GETTERS_AS_SETTERS, false)
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
mapper.enableDefaultTyping()
mapper.registerModule(JavaTimeModule())
val hibernateModule = Hibernate5Module()
hibernateModule.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false)
hibernateModule.configure(Hibernate5Module.Feature.SERIALIZE_IDENTIFIER_FOR_LAZY_NOT_LOADED_OBJECTS, true)
mapper.registerModule(hibernateModule)
(Это Kotlin, но в java все то же самое)
И мой тест выглядит так:
var contract = contractRepository.findById(42).get() // 1
val serialized = mapper.writeValueAsString(contract) // 2
val result = mapper.readValue(serialized, Contract::class.java) // 3
Когда я сериализую объект - все работает так, как я ожидал (строки 1-2). Я получаю JSON как это в serialized
:
{
"id": 42,
"status": {
"id": [
"java.lang.Long",
4242
]
}
}
Но когда я пытаюсь десериализовать (строка 3), я получаю исключение:
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.Long` out of START_ARRAY token
at [Source: (String)"{"id":42,"status":{"id":["java.lang.Long",4242]}"[truncated 56 chars]; line: 1, column: 63] (through reference chain: my.example.app.models.Contract["status"]->my.example.app.models.DocStatus["id"])
Итак, как сериализовать и правильно десериализовать объекты гибернации?