引入的 JSON 工具类依赖包:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.10.1</version>
</dependency>

配置文件内 JSON 配置:

spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

定义的解析类字段:

    /**
    * 入库、出库日期
    */
    @ApiModelProperty("入库、出库日期 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date operationDate;

详细错误信息:

运行时异常:Invalid JSON input: Cannot deserialize value of type `java.sql.Date` from String \"2024-05-24T01:06:58.656Z\": expected format \"yyyy-MM-dd HH:mm:ss\"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Date` from String \"2024-05-24T01:06:58.656Z\": expected format \"yyyy-MM-dd HH:mm:ss\"\n at [Source: (PushbackInputStream); line: 5, column: 19] (through reference chain: com.fastcnt.afterloan.vo.CarOperationReqVO[\"operationDate\"])

...

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Date` from String "2024-05-24T01:06:58.656Z": expected format "yyyy-MM-dd HH:mm:ss"
 at [Source: (PushbackInputStream); line: 5, column: 19] (through reference chain: com.fastcnt.afterloan.vo.CarOperationReqVO["operationDate"])

...

Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input: Cannot deserialize value of type `java.sql.Date` from String "2024-05-24T01:06:58.656Z": expected format "yyyy-MM-dd HH:mm:ss"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.sql.Date` from String "2024-05-24T01:06:58.656Z": expected format "yyyy-MM-dd HH:mm:ss"
 at [Source: (PushbackInputStream); line: 5, column: 19] (through reference chain: com.fastcnt.afterloan.vo.CarOperationReqVO["operationDate"])]

网上翻了一圈,有点把自己都搞混乱了,回过头来理解就比较简单了。JSON 日期格式解析会有一个默认的 patternyyyy-MM-dd'T'HH:mm:ss.SSS'Z'。查了一下,这个属于 UTC 下的 ISO 1681 日期表示方法,T分隔日期和时间,Z放在末尾。此时如果不做任何的配置,那么默认就会以这种格式来解析 JSON 中的日期。

但我们正常使用的都是 yyyy-MM-dd HH:mm:ss 格式,包括传递参数,所以会倾向于设置一下默认的解析格式,即像上面的JSON 配置。这也是错误说明里解释了为什么期望的是 expected format \"yyyy-MM-dd HH:mm:ss\" 格式。配置文件里的配置项属于全局配置,这意味着所有的这种格式的日期都不需要添加 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") 注解,即可直接使用。

那么现在问题就清晰了,需要针对 2024-05-24T01:06:58.656Z 格式的日期,设置匹配的 pattern

    /**
    * 入库、出库日期
    */
    @ApiModelProperty("入库、出库日期 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
    private Date operationDate;