Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Converter. Поле PostgreSQL jsonb. Как сохранить поле с типом JsonNode  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1993
Всем, привет!

Добавил довольно-таки стандартный конвертер:

Есть поле в классе с аннотацией конвертера:
@Convert(converter = JpaConverterJson.class)
private JsonNode src;

Сам конвертер:
+ JpaConverterJson
@Converter(autoApply = true)
public class JpaConverterJson implements AttributeConverter<JsonNode, String> {

    private final static ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public String convertToDatabaseColumn(JsonNode meta) {
        try {
            String string = objectMapper.writeValueAsString(meta);
            return string;
        } catch (JsonProcessingException ex) {
            return null;
            // or throw an error
        }
    }

    @Override
    public JsonNode convertToEntityAttribute(String dbData) {
        try {
            return objectMapper.readValue(dbData, JsonNode.class);
        } catch (IOException ex) {
            // logger.error("Unexpected IOEx decoding json from database: " + dbData);
            return null;
        }
    }

}


В результате могу читать из бд этот объект, но не могу сохранять через стандартный метод JpaRepository - repository.save()
Потому что:
Caused by: org.postgresql.util.PSQLException: ERROR: column "src" is of type jsonb but expression is of type character varying
Подсказка: You will need to rewrite or cast the expression.

Что логично, метод конвертера String convertToDatabaseColumn, а нужно кастануть в jsonb

Реально ли как-то сделать это без NativeQuery? И пока даже не уверен, что и через это можно, хотя если в запросе указать все поля объекта.. Пока так попробую, но что-то мне сам этот способ не особо нравится, похоже на костыль и нестандартное решение :)
15 мар 20, 09:02    [22099256]     Ответить | Цитировать Сообщить модератору
 Re: Converter. Поле PostgreSQL jsonb. Как сохранить поле с типом JsonNode  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1993
Изначально поле было
@Type(type = "JsonbDataUserType")
private JsonObject src;

ну и над классом было @TypeDef(name = "JsonUserType", typeClass = JsonUserType.class)

и на вход метода сохранения в контроллере было @RequestBody JsonNode jsonNode
что не очень-то нравилось, приходилось это поле src выдирать из JsonNode, в dto его потом мапить как toString() т.к. в dto поле src уже было String. Сейчас в dto тоже private JsonNode src; чтобы маппить entity to Dto без лишних итераций с полями.
15 мар 20, 09:48    [22099261]     Ответить | Цитировать Сообщить модератору
 Re: Converter. Поле PostgreSQL jsonb. Как сохранить поле с типом JsonNode  [new]
SpringMan
Member

Откуда:
Сообщений: 139
Видел это добро?

Сообщение было отредактировано: 15 мар 20, 12:24
15 мар 20, 12:24    [22099307]     Ответить | Цитировать Сообщить модератору
 Re: Converter. Поле PostgreSQL jsonb. Как сохранить поле с типом JsonNode  [new]
Nixic
Member

Откуда: Perm
Сообщений: 1993
SpringMan
Видел это добро?

Да, не хочу дополнительные либы какие-то добавлять. Похоже вернусь к старому рабочему коду сейчас)
16 мар 20, 07:06    [22099606]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить