我有一个域对象列表,这些域对象已保存到postgres jsonb列(hibernate / jackson)。保存按预期工作,但是反序列化时出现映射异常。看起来杰克逊(Jackson)试图反序列化到域对象,而不是类型指定的域对象列表。
这是字段。它被序列化并正确保存为商店列表。
@TypeDef(name = "stores",
typeClass = JSONBUserType.class,
parameters = {
@Parameter(name = JSONBUserType.CLASS,
value = "com.project.domain.metadata.Store")
}
)
@Column(name = "stores")
@Type(type = "stores")
private List<Store> stores;
这是获取保存的信息时出现的错误。看起来杰克逊正在尝试将其反序列化为Store对象,而不是List<Store>
。
org.springframework.orm.jpa.JpaSystemException: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.tgt.mkt.customdam.domain.metadata.Store out of START_ARRAY token
at [Source: [{"id": "T1230", "description": "store description"}]; line: 1, column: 1]; nested exception is org.hibernate.HibernateException: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of com.tgt.mkt.customdam.domain.metadata.Store out of START_ARRAY token
at [Source: [{"id": "1230", "description": "store description"}]; line: 1, column: 1]
这是我发送的用于保存Postman信息的请求正文的摘要。杰克逊有理由从REST调用中反序列化列表,但从数据库中反序列化吗?
"stores": [
{
"id": "T1230",
"description": "store description"
}
],
答案 0 :(得分:1)
在我的团队正在研究的另一个项目中找到了解决方案。我不知道如何或为什么,但是通过在前缀前面加上[[L]并在类名的末尾添加分号来更新@Parameter,以解决问题。
@Parameter(name = JSONBUserType.CLASS,
value = "[Lcom.tgt.mkt.customdam.domain.metadata.Store;")
并将字段更新为Store []。
@Column(name = "stores")
@Type(type = "stores")
private Store[] stores;