首页 > 解决方案 > 杰克逊的春季启动无法验证 java.util.Date

问题描述

我需要使用模式 'yyyy-MM-dd HH:mm:ss' 验证日期。我正在使用带有杰克逊版本 2.10.2 的 util date,并且我无法根据公司要求迁移到 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”,那么应用程序会抛出内部服务器错误异常。

标签: javaspring-bootdatevalidationjackson

解决方案


它是SimpleDateFormat处理实际可配置解析的。您可以将 的值设置lenientfalse

代替

@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)

推荐阅读