Я создаю новый 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)
JSON
иJSONB
. Добавлен новый кодек -io.r2dbc.postgresql.codec.Json
. Новая ссылка - person Avinash Anand   schedule 08.10.2019