简体   繁体   中英

Jooq deserialize JSON date to java.time.LocalDateTime incorrectly without annotation @JsonDeserialize

Is possible to remove annotation like:

    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    protected LocalDateTime createTime;

from code, and create some one place configuration in springboot?

Problem occure, when i try to get data from database this way:

public SomeDataMasterDto findById(Integer id) {
        SomeDataMasterDto someDataMasterDto = dslContext
                .select(jsonObject(
                        key("id").value(SOME_DATA_MASTER.ID),
                        key("createTime").value(SOME_DATA_MASTER.CREATE_TIME),
                        key("orderTime").value(SOME_DATA_MASTER.ORDER_TIME),
                        key("someDataOtherDtos").value(jsonArrayAgg(jsonObject(
                                key("id").value(SOME_DATA_OTHER.ID),
                                key("createTime").value(SOME_DATA_OTHER.CREATE_TIME),
                                key("offerType").value(SOME_DATA_OTHER.OFFER_TYPE),
                        )).absentOnNull())
                ))
                .from(SOME_DATA_MASTER)
                .leftJoin(SOME_DATA_OTHER).on(SOME_DATA_OTHER.SOME_DATA_MASTER_ID.eq(SOME_DATA_MASTER.ID))
                .where(SOME_DATA_MASTER.ID.eq(id))
                .groupBy(SOME_DATA_MASTER.ID)
                .fetchOneInto(SomeDataMasterDto.class);

        return someDataMasterDto;
}

I try override ObjectMapper in springboot like:

@Configuration
public class JacksonObjectMapper {

    @Bean
    public ObjectMapper objectMapper() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());

        return mapper;
    }
}

but i think, that jooq use own created objectMapper. I tried also other examples from stackoverflow (with Jackson2ObjectMapperBuilder , DateFormatter ...) but without success.

Environment:

  • jdk 11
  • jooq 3.14.4
  • springboot 2.4.1
  • postgresql 12.2

I'm assuming you're using this approach as it was recommended in jOOQ 3.14 to use SQL/JSON to nest collections with jOOQ ? If you're ready to upgrade to jOOQ 3.15, the SQL/JSON serialisation bits can be abstracted using the new standard SQL MULTISET support , in case of which you can write:

SomeDataMasterDto result =
ctx.select(
       SOME_DATA_MASTER.ID,
       SOME_DATA_MASTER.CREATE_TIME,
       SOME_DATA_MASTER.ORDER_TIME,
       multisetAgg(
           SOME_DATA_OTHER.ID,
           SOME_DATA_OTHER.CREATE_TIME,
           SOME_DATA_OTHER.OFFER_TYPE,
       ).as("someDataOtherDtos")
           .convertFrom(r -> r.map(Records.mapping(SomeDataOtherDto::new)))
   )
   .from(SOME_DATA_MASTER)
   .leftJoin(SOME_DATA_OTHER)
       .on(SOME_DATA_OTHER.SOME_DATA_MASTER_ID.eq(SOME_DATA_MASTER.ID))
   .where(SOME_DATA_MASTER.ID.eq(id))
   .groupBy(SOME_DATA_MASTER.ID)
   .fetchOne(Records.mapping(SomeDataMasterDto::new));

The above mapping approach is using the new ad-hoc conversion features and is assuming your DTOs are immutable objects (eg Java 16 records). You can still use the reflection methods, if you prefer that, using into(Class<?>)

See also:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM