LocalDate сериализует CSV с ошибкой jackson-dataformat-csv - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь сериализовать объект, содержащий java.time.LocalDate, двумя способами, но оба не удаются.

  1. Аннотация с @JsonUnwrapped и @JsonFormat(shape=JsonFormat.Shape.STRING) получить ошибку:

    Исключение в потоке " main "com.faster xml .jackson.dataformat.csv.CsvMappingException: генератор CSV не поддерживает значения объектов для свойств (вложенных объектов) (через цепочку ссылок: java .util.ArrayList [0] -> models.DateRange) ["fini sh"] -> java .time.LocalDate ["хронология"])

@Data
@AllArgsConstructor
@NoArgsConstructor
//@JsonFormat(shape=JsonFormat.Shape.STRING)
public class DateRange {
  @JsonUnwrapped
  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate start;
  @JsonUnwrapped
  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate finish;
}

--------
public class CsvPractice {
  public static void main(String[] args) throws JsonProcessingException {
    ArrayList<DateRange> csv = Lists.newArrayList();
    for (int i = 1; i < 6; i++) {
      csv.add(new DateRange(LocalDate.now().plusDays(i), LocalDate.now().plusDays(i + 1)));
    }
    CsvMapper mapper = new CsvMapper();
//    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    CsvSchema schema = mapper.schemaFor(DateRange.class).withHeader();
    System.out.println(mapper.writer(schema).writeValueAsString(csv));
  }
}
Конфигуратор отображения mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); без аннотации на объекты, но получить:

Исключение в потоке "main" com.faster xml .jackson.dataformat.csv.CsvMappingException: генератор CSV не поддерживает значения объектов для свойства (вложенные объекты) (через цепочку ссылок: java .util.ArrayList [0] -> models.DateRange ["fini sh"])

@Data
@AllArgsConstructor
@NoArgsConstructor
//@JsonFormat(shape=JsonFormat.Shape.STRING)
public class DateRange {
//  @JsonUnwrapped
//  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate start;
//  @JsonUnwrapped
//  @JsonFormat(shape=JsonFormat.Shape.STRING)
  private LocalDate finish;
}
---------
public class CsvPractice {
  public static void main(String[] args) throws JsonProcessingException {
    ArrayList<DateRange> csv = Lists.newArrayList();
    for (int i = 1; i < 6; i++) {
      csv.add(new DateRange(LocalDate.now().plusDays(i), LocalDate.now().plusDays(i + 1)));
    }
    CsvMapper mapper = new CsvMapper();
    mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
    CsvSchema schema = mapper.schemaFor(DateRange.class).withHeader();
    System.out.println(mapper.writer(schema).writeValueAsString(csv));
  }
}

Моя версия Джексона:

    <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-csv</artifactId>
      <version>2.9.8</version>
    </dependency>

Что-то я пропустил?

См.

1 Ответ

2 голосов
/ 14 января 2020

Ваш код почти там. Ваша проблема в том, что ваш маппер неправильно сериализует LocalDate.

Чтобы включить сериализацию Джексона Java 8 типов даты и времени, вам необходимо включить следующий модуль:

https://mvnrepository.com/artifact/com.fasterxml.jackson.datatype/jackson-datatype-jsr310/2.10.1

После выполнения поэтому вам нужно изменить код, чтобы зарегистрировать модуль JSR-310 для Джексона, а затем дать ему команду отключить SerializationFeature.WRITE_DATES_AS_TIMESTAMPS.

Итак, основываясь на вышеизложенном, включите модуль, а затем просто выполните следующее изменение кода:

CsvMapper mapper = new CsvMapper();
mapper.findAndRegisterModules();
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

После выполнения ожидаемый результат должен выглядеть примерно так:

finish,start
2020-01-16,2020-01-15
2020-01-17,2020-01-16
2020-01-18,2020-01-17
2020-01-19,2020-01-18
2020-01-20,2020-01-19
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...