Весенняя загрузка с Джексоном не может проверить java.util.Date

#java #spring-boot #date #validation #jackson

#java #весенняя загрузка #Дата #проверка #джексон

Вопрос:

Мне нужно проверить дату с помощью шаблона ‘гггг-ММ-дд ЧЧ: мм: сс’. Я использую util date с версией jackson 2.10.2 и не могу перейти на java 8 localdate в качестве требования компании. Я нашел много вопросов и ответов по этой проблеме, и ни один из них не решил мою проблему должным образом.

 import com.fasterxml.jackson.annotation.*;
import lombok.Data;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "provisionedDate",
    })
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY,
        getterVisibility = JsonAutoDetect.Visibility.NONE,
        setterVisibility = JsonAutoDetect.Visibility.NONE)

public class PostProvisionCallback implements Serializable {

    @JsonProperty("id")
    private String id;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    @NotNull(message = "provisionedDate cannot be null")
    @JsonProperty("provisionedDate")
    private Date provisionedDate;

}
  

даже если я ввожу недопустимую дату, например ‘20201-0612213-17 09:26:12’, все равно это оценивается как действительная дата. Каково идеальное решение для этого.? но если я введу дату как «2020/03/04 09:26:12», тогда приложение выдаст исключение ошибки внутреннего сервера.

Комментарии:

1. Я рекомендую вам не использовать Date . Этот класс плохо разработан и давно устарел. Вместо этого используйте LocalDateTime или какой-либо другой класс из java.time, современный Java date и time API .

Ответ №1:

Это SimpleDateFormat то, что обрабатывает фактический настраиваемый синтаксический анализ. Вы можете установить значение lenient as false .

Заменить

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
  

с

 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", lenient = OptBoolean.FALSE)