Я пытаюсь стандартизировать даты в нашем приложении для отправки 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();