Как я могу использовать Spring для десериализации столбца Postgres JSONB в список объектов? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть список объектов домена, сохраняемых в столбце postgres jsonb (hibernate / 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 Ответ

1 голос
/ 22 марта 2019

Нашел решение в другом проекте, над которым работает моя команда. Я не уверен, как и почему, но обновив @Parameter, добавив "[L" и добавив точку с запятой в конце имени класса, исправил это.

@Parameter(name = JSONBUserType.CLASS,
            value = "[Lcom.tgt.mkt.customdam.domain.metadata.Store;")

и обновление поля до Store [].

    @Column(name = "stores")
    @Type(type = "stores")
    private Store[] stores;
...