Search code examples
spring-bootspring-webfluxpostgresql-9.1spring-data-r2dbc

Saving json array into postgresql data using spring boot java API


I have a Json Array in my request object and POJO object, I need to save that jsonarray field into jsonb column in my postgresql table.

"productId": "1",
"product":[ 
     {
     "name": "PENCIL",
     "quantity":"5"
     }]

I am getting an exception when trying to hit it via postman, getting exception:

Type definition error: [simple type, class io.r2dbc.postgresql.codec.Json]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of io.r2dbc.postgresql.codec.Json (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: (io.netty.buffer.ByteBufInputStream); l


Solution

  • Create a converter for reading and a converter for writing, thus it will convert between your type and Postgres io.r2dbc.postgresql.codec.Json.

    @ReadingConverter
    @RequiredArgsConstructor
    public class JsonToYourTypeConverter implements Converter<Json, YourType > {
        private final ObjectMapper objectMapper;
        @Override
        public YourType convert(Json json) {
        }
    }
    
    @WritingConverter
    @RequiredArgsConstructor
    public class YourTypeToJsonConverter implements Converter<YourType, Json > {
        private final ObjectMapper objectMapper;
        @Override
        public Json convert(YourType data) {
        }
    }
    

    Then register your converters via R2dbcCustomConversions bean.

    @Bean
    public R2dbcCustomConversions r2dbcCustomConversions(ConnectionFactory connectionFactory, ObjectMapper objectMapper) {
        var dialect = DialectResolver.getDialect(connectionFactory);
        var converters = List.of(
                new JsonToYourTypeConverter(objectMapper),
                new YourTypeToJsonConverter(objectMapper),
        );
        return R2dbcCustomConversions.of(dialect, converters);
    }