LocalDateTime анализирует недопустимые даты к действительной дате и не выдает никаких исключений - PullRequest
3 голосов
/ 12 апреля 2020

Я использую LocalDateTime в теле запроса моего API в Spring.

  @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-mm-dd HH:mm:ss")
  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  @JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime createdAt;

Когда в запросе указана недопустимая дата, например «2020-02-31 00:00:00», она автоматически преобразуется в «2020-02-29 00:00:00». Я хочу выбросить исключение в случае неверной даты. В официальной документации упоминается, что она конвертируется в предыдущую действительную дату.

 In some cases, changing the specified field can cause the resulting date-time to become invalid,
 such as changing the month from 31st January to February would make the day-of-month invalid.
 In cases like this, the field is responsible for resolving the date.
 Typically it will choose the previous valid date, 
 which would be the last valid day of February in this example.

1 Ответ

3 голосов
/ 12 апреля 2020

Для этого вам нужно написать собственный сериализатор.

class CustomLocalDateTimeSerializer extends StdSerializer<LocalDateTime> {
    private static final DateTimeFormatter FORMATTER
            = DateTimeFormatter.ofPattern("yyyy-mm-dd HH:mm:ss");

    ...

    @Override
    public void serialize(LocalDateTime value, JsonGenerator generator, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        // Do your validation using FORMATTER.
        // Serialize the value using generator and provider.
    }
}

Тогда вы можете просто использовать его в своей аннотации.

@JsonSerialize(using = CustomLocalDateTimeSerializer.class)

Обратите внимание, что DateTimeFormatter выдает исключение при форматировании / разборе недопустимых значений.

Проверьте источник LocalDateTimeSerializer, чтобы узнать, что нужно сделать. Проверьте Дата Джексона - 10. Сериализация Java 8 Дата без какой-либо дополнительной зависимости для примеров написания собственного сериализатора. Это делается аналогично для пользовательского десериализатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...