我要序列化和反序列化未加载代理的休眠对象。
我这样准备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"])
那么,如何正确地序列化和反序列化休眠实体?