Десериализация прокси спящего режима - PullRequest
0 голосов
/ 08 мая 2020

Я хочу сериализовать и десериализовать объект гибернации с незагруженными прокси.

Я готовлю 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"])

Итак, как сериализовать и правильно десериализовать объекты гибернации?

...