Джексон ошибочно сериализует ZonedDateTime в Spring Boot

Вы знаете несколько тонких различий в безопасности. См. Мой вопрос

GET по сравнению с POST с точки зрения безопасности?

blockquote>

По сути важно помнить, что GET пойдет в историю браузера и будет передаваться через прокси в виде простого текста, поэтому вам не нужна какая-либо конфиденциальная информация, например пароль в GET.

Очевидно, возможно, но стоит упомянуть.

23
задан jbx 22 August 2016 в 19:32
поделиться

2 ответа

Существует библиотека jackson-datatype-jsr310 . Попробуй.

Эта библиотека охватывает новый API даты и времени и включает сериализаторы для ZonedDateTime.

Все, что вам нужно, это просто добавить JavaTimeModule:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());

ОБНОВЛЕНИЕ

Для преобразования даты и времени в строку ISO-8601 Вы должны отключить функцию WRITE_DATES_AS_TIMESTAMPS . Вы можете легко сделать это путем переопределения компонента ObjectMapper или использования свойств приложения :

spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false
39
ответ дан vsminkov 22 August 2016 в 19:32
поделиться

Ответ уже упоминался выше, но я думаю, что отсутствует какая-то информация. Для тех, кто хочет анализировать временные метки Java 8 во многих формах (не только ZonedDateTime). Вам нужна последняя версия jackson-datatype-jsr310 в вашем POM, и у вас зарегистрирован следующий модуль:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

Для проверки этого кода

@Test
void testSeliarization() throws IOException {
    String expectedJson = "{\"parseDate\":\"2018-12-04T18:47:38.927Z\"}";
    MyPojo pojo = new MyPojo(ZonedDateTime.parse("2018-12-04T18:47:38.927Z"));

    // serialization
    assertThat(objectMapper.writeValueAsString(pojo)).isEqualTo(expectedJson);

    // deserialization
    assertThat(objectMapper.readValue(expectedJson, MyPojo.class)).isEqualTo(pojo);
}

Обратите внимание, что вы можете настроить объектный преобразователь глобально. весной или dropwizard для достижения этой цели. Я еще не нашел чистого способа сделать это как аннотацию к полю без регистрации пользовательского (де) сериализатора.

1
ответ дан UltimaWeapon 22 August 2016 в 19:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: