Можно ли вручную использовать типы данных postgresql JSON или JSONB с spring r2dbc?

Я создаю новый api с весенней загрузкой, webflux и r2dbc (postgresql). В одной из моих таблиц будет поле json или jsonb для хранения динамического документа json.

На данный момент r2dbc не поддерживает типы данных json для базы данных postgresql. Мне интересно, можно ли его использовать в любом случае, написав код для репозитория.

Я создал простой тестовый проект, чтобы попробовать это, но пока безуспешно. Мне удалось сохранить поле JSON, используя org.springframework.data.r2dbc.core.DatabaseClient.execute() и заключив поле json в to_json() в запросе, но я не смог прочитать его позже.

Тестовый объект:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("Test")
public class Test {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", columnDefinition = "serial")
    private Long id;
    @Column(name = "data", columnDefinition = "json")
    private String data;

}

Сохранить метод работы:

public Mono<Integer> save(Test test) {
        return databaseClient.execute("INSERT INTO test (data) VALUES(to_json($1))")
                .bind("$1", test.getData())
                .fetch()
                .rowsUpdated();
    }

Исключение при чтении:

java.lang.IllegalArgumentException: Cannot decode value of type java.lang.Object
    at io.r2dbc.postgresql.codec.DefaultCodecs.decode(DefaultCodecs.java:97)
    at io.r2dbc.postgresql.PostgresqlRow.get(PostgresqlRow.java:88)
    at io.r2dbc.spi.Row.get(Row.java:63)
    at org.springframework.data.r2dbc.convert.ColumnMapRowMapper.getColumnValue(ColumnMapRowMapper.java:100)
    at org.springframework.data.r2dbc.convert.ColumnMapRowMapper.apply(ColumnMapRowMapper.java:59)
    at org.springframework.data.r2dbc.convert.ColumnMapRowMapper.apply(ColumnMapRowMapper.java:44)
    at io.r2dbc.postgresql.PostgresqlResult.lambda$map$0(PostgresqlResult.java:71)

person Cesar Angiolucci    schedule 26.07.2019    source источник
comment
Согласно этом блоге, новый кандидат на выпуск поддерживает это.   -  person Avinash Anand    schedule 06.10.2019
comment
Выше ссылка мертва ...   -  person Cesar Angiolucci    schedule 08.10.2019
comment
Извините, я думаю, они удалили примечания к выпуску. но теперь в README говорится, что он поддерживает JSON и JSONB. Добавлен новый кодек - io.r2dbc.postgresql.codec.Json. Новая ссылка   -  person Avinash Anand    schedule 08.10.2019
comment
Я просто попробовал это, но пока не смог использовать этот подход с spring-data-r2dbc. Поддержка r2dbc есть, но ее еще нет в абстракции spring-data-r2dbc.   -  person Cesar Angiolucci    schedule 08.10.2019


Ответы (2)


Используйте io.r2dbc.postgresql.codec.Json в качестве типа свойства объекта, отметьте мой пост об этом.

person Hantsy    schedule 08.10.2020

Я смог сделать это, преобразовав json / jsonb в ТЕКСТ через запрос. Я не уверен, что это правильный выбор, но он работает.

public Mono<Test> findById(Long id) {
    return databaseClient.execute("SELECT id, data::TEXT FROM test WHERE id = $1")
            .bind("$1", id)
            .map(row -> new Test(
                          row.get("id", Long.class),
                          row.get("data", String.class)
                        )
            )
            .one();
}
person Cesar Angiolucci    schedule 01.08.2019