Jackson сериализует LocalDateTime как массив чисел — и это не баг библиотеки

ObjectMapper без модуля JSR-310 не бросает исключение на LocalDateTime, он его сериализует своим способом — как массив [2024, 8, 28, 14, 30, 15]. Разработчик на фронте получает не строку, а непонятный массив и тратит час на дебаг.

Причина — ObjectMapper по умолчанию не знает про java.time. Без jackson-datatype-jsr310 в classpath он падает на дефолтную reflection-based сериализацию, которая раскладывает LocalDateTime на внутренние поля: year, month, day, hour, minute, second, nano — в порядке объявления в классе.

Регистрация модуля решает и формат, и стабильность: с WRITE_DATES_AS_TIMESTAMPS = false дата уходит строкой ISO-8601, а не массивом и не epoch millis.

ObjectMapper mapper = new ObjectMapper() .registerModule(new JavaTimeModule()) .disable(SerializationFeature .WRITE_DATES_AS_TIMESTAMPS);

Спросят следом: что будет, если модуль зарегистрирован, но забыли disable WRITE_DATES_AS_TIMESTAMPS. Ответ — дата уйдёт как epoch-секунды с дробной частью, а не ISO-строка, и фронт снова получит не то, что ожидал, просто в другом формате.

Дефолтная сериализация java.time в Jackson без модуля — это не ошибка, это поведение, которое нужно явно выключить.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки