Можно ли упростить аннотации @JsonSerialize? - PullRequest
3 голосов
/ 23 апреля 2019

Следующий код работает нормально:

    // works
public class MyClass {

  @JsonSerialize(using = LocalDateTimeSerializer.class)
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  private LocalDateTime startDate;

  @JsonSerialize(using = LocalDateTimeSerializer.class)
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  private LocalDateTime endDate;

  @JsonSerialize(using = LocalDateTimeSerializer.class)
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  private LocalDateTime otherDate;

  @JsonSerialize(using = LocalDateTimeSerializer.class)
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  private LocalDateTime someMoreDate;

...}

Но мне не нравится повторяющийся аспект написания одинаковых аннотаций для каждого поля даты.

Что я пробовал:

// does not work

  @JsonSerialize(using = LocalDateTimeSerializer.class)
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
public class MyClass {


  private LocalDateTime startDate;
  private LocalDateTime endDate;
  private LocalDateTime otherDate;
  private LocalDateTime someMoreDate;

...}

Попытка этого приводит к ошибке:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: 
class MyClass cannot be cast to class java.time.LocalDateTime (MyClass is in unnamed module of loader 'app'; java.time.LocalDateTime is in module java.base of loader 'bootstrap') (through reference chain: java.util.HashMap["ctxData"])

Конфигурация приложения пружины была расширена:

@Bean(name = "OBJECT_MAPPER_BEAN")
  public ObjectMapper jsonObjectMapper() {
    return Jackson2ObjectMapperBuilder.json()
        .serializationInclusion(JsonInclude.Include.NON_NULL)
        .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
        .modules(new JavaTimeModule())
        .build();
  }

Любые идеи, что я могу попробовать?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Если вы используете jackson для управления сериализацией / десериализацией json с помощью Spring, вы можете настроить ObjectMapper глобально:

@Bean
public Jackson2ObjectMapperBuilder objectMapperBuilder() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();

    builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
    builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ISO_DATE_TIME));

    return builder;
}
1 голос
/ 23 апреля 2019

При этом будет использоваться LocalDateTimeSerializer / LocalDateTimeDeserializer для сериализации / десериализации всего MyClass, а не его временных полей.

@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
public class MyClass {

Вместо этого вы можете просто зарегистрировать JavaTimeModule на своем ObjectMapper.

...