You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Data Elasticsearch日期查询时ZonedDateTime反序列化报错问题

错误原因

你遇到的错误是Spring MVC反序列化请求JSON阶段抛出的,还没执行到ES查询逻辑,核心原因如下:

  1. ES实体类Logging上的@Field(type = FieldType.Date, format = DateFormat.basic_date_time)注解仅作用于Spring Data ES和ES交互时的序列化/反序列化规则,不影响Spring MVC接收接口请求时的JSON解析。
  2. Jackson默认解析ZonedDateTime的格式是带分隔符的标准ISO格式(比如2021-09-01T15:27:02.620+04:00),而你传的是basic_date_time格式(无日期/时间分隔符的20210901T152702.620+04:00),格式不匹配导致解析失败。

解决方案

方案1:单独为请求参数类指定日期格式

直接在LoggingSearchCriteria类的日期字段上加@JsonFormat注解,指定和入参匹配的格式即可:

import com.fasterxml.jackson.annotation.JsonFormat;

public class LoggingSearchCriteria extends AbstractSearchRequest {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd'T'HHmmss.SSSXXX")
    private ZonedDateTime dateTo;
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd'T'HHmmss.SSSXXX")
    private ZonedDateTime dateFrom;
}

该方案对其他接口无影响,适合仅当前接口使用该日期格式的场景。

方案2:全局配置Jackson日期格式

如果项目中所有接口都使用该格式的ZonedDateTime,可以直接在application.yml/application.properties中添加全局配置:

spring:
  jackson:
    date-format: yyyyMMdd'T'HHmmss.SSSXXX
    time-zone: GMT+4 # 替换为你实际使用的时区
    serialization:
      write-dates-as-timestamps: false

配置后所有接口的ZonedDateTime解析都会默认使用该格式。

补充说明

请求参数反序列化成功后,调用Spring Data ES执行范围查询时,框架会自动按照Logging实体中createdDate字段指定的basic_date_time格式转换查询参数,无需额外处理。

内容的提问来源于stack exchange,提问作者user1999453

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 00:36:05