Есть ли способ сериализации и десериализации ВСЕХ дат до UT C миллисекунд? - PullRequest
0 голосов
/ 12 февраля 2020

Я пытаюсь стандартизировать даты в нашем приложении для отправки UT C миллисекунд в запросах и ответах.

Приложение использует Spring Boot для бэкэнда REST. Я добавил BasicStringTypeAdapters для java.util.Date, java.time.LocalDateTime и java.time.Instant, как показано ниже, но ни один из них не применяется.

Если я добавлю фиктивный для java.lang.String, он будет работать, поэтому я Я знаю, что они зарегистрированы в соответствующем месте.

Однако я считаю, что код здесь безусловно перезаписывает эти адаптеры. В частности registerJsonTypeAdapters(Java8TypeAdapters.adapters()); перезаписывает java.time.LocalDateTime и java.time.Instant и (я считаю) gsonBuilder.serializeNulls().setDateFormat(ISO_DATE_TIME_FORMAT); перезаписывает java.util.Date.

Если я ошибаюсь, может кто-нибудь указать мне правильное направление, как сериализовать все даты как UT C миллис?

Если я прав, могу ли я получить совет? о том, как действовать?

return TransactionalJaversBuilder
        .javers()
        .withTxManager(transactionManager)
        .withObjectAccessHook(new HibernateUnproxyObjectAccessHook())
        .registerJaversRepository(sqlRepository)
        .registerValueTypeAdapter(
            new BasicStringTypeAdapter<Date>() {
              @Override
              public Class getValueType() {
                return Date.class;
              }

              @Override
              public String serialize(Date value) {
                return String.valueOf(value.getTime());
              }

              @Override
              public Date deserialize(String in) {
                return new Date(Long.valueOf(in));
              }
            }
        )
        .registerValueTypeAdapter(
            new BasicStringTypeAdapter<LocalDateTime>() {
              @Override
              public Class getValueType() {
                return LocalDateTime.class;
              }

              @Override
              public String serialize(LocalDateTime value) {
                return String.valueOf(value.toInstant(ZoneOffset.UTC).toEpochMilli());
              }

              @Override
              public LocalDateTime deserialize(String in) {
                return Instant.ofEpochMilli(Long.valueOf(in)).atZone(ZoneOffset.UTC).toLocalDateTime();
              }
            }
        )
        .registerValueTypeAdapter(
            new BasicStringTypeAdapter<Instant>() {
              @Override
              public Class getValueType() {
                return Instant.class;
              }

              @Override
              public String serialize(Instant value) {
                return String.valueOf(value.toEpochMilli());
              }

              @Override
              public Instant deserialize(String in) {
                return Instant.ofEpochMilli(Long.valueOf(in));
              }
            }
        )
        .build();
...