如何使用spring将postgres jsonb列反序列化为对象列表?

时间:2019-03-22 16:45:30

标签: hibernate jackson spring-data-jpa

我有一个域对象列表,这些域对象已保存到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"
        }
    ],

1 个答案:

答案 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;