反序列化冬眠代理

时间:2020-05-07 22:45:46

标签: java hibernate jackson

我要序列化和反序列化未加载代理的休眠对象。

我这样准备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行)。我在serialized中得到了这样的JSON:

{
    "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"])

那么,如何正确地序列化和反序列化休眠实体?

0 个答案:

没有答案
相关问题