Spring для автоматической сериализации OffsetDateTime в качестве метки времени

#spring #datetime #serialization #java-8

#spring #datetime #сериализация #java-8

Вопрос:

У меня есть группа микросервисов spring, и большинство ответов содержат timestamp поле

 @NotNull
public OffsetDateTime timestamp = OffsetDateTime.now(ZoneOffset.UTC);
  

этот атрибут сериализуется как

   "timestamp": {
    "offset": {
      "totalSeconds": 0,
      "id": "Z",
      "rules": {
        "transitionRules": [],
        "transitions": [],
        "fixedOffset": true
      }
    },
    "nano": 998000000,
    "year": 2019,
    "dayOfWeek": "TUESDAY",
    "hour": 12,
    "month": "MARCH",
    "dayOfMonth": 26,
    "dayOfYear": 85,
    "minute": 20,
    "monthValue": 3,
    "second": 33
  },
  

Есть ли какой-либо способ настроить Spring для сериализации его как обычного объекта timeStamp
2015-10-20T11:00:00-8:30

Ответ №1:

Вы можете реализовать сериализатор, подобный:

 import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;

import java.io.IOException;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class OffsetDateTimeSerializer extends StdSerializer<OffsetDateTime> {
    public OffsetDateTimeSerializer() {
        super(OffsetDateTime.class);
    }

    @Override
    public void serialize(final OffsetDateTime dateTime, final JsonGenerator generator,
                          final SerializerProvider provider) throws IOException {
        generator.writeString(dateTime.format(DateTimeFormatter.ISO_OFFSET_DATE_TIME));
    }
}

  

и аннотируйте свои поля с помощью:

 @JsonSerialize(using = OffsetDateTimeSerializer.class)