Spring Data Elasticsearch日期查询时ZonedDateTime反序列化报错问题
错误原因
你遇到的错误是Spring MVC反序列化请求JSON阶段抛出的,还没执行到ES查询逻辑,核心原因如下:
- ES实体类
Logging上的@Field(type = FieldType.Date, format = DateFormat.basic_date_time)注解仅作用于Spring Data ES和ES交互时的序列化/反序列化规则,不影响Spring MVC接收接口请求时的JSON解析。 - 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
相关产品推荐
相关产品推荐

