POST请求时java.time.OffsetDateTime反序列化失败报错如何解决?
报错原因
- 你配置的
@JsonFormat时间格式为yyyy-MM-dd HH:mm:ss,但请求传入的时间字符串用T作为日期和时间的分隔符,格式不匹配 OffsetDateTime类型本身要求时间字符串带时区偏移信息,你传入的字符串无偏移值,无法直接反序列化
解决方案
方案1:适配现有入参格式,保留OffsetDateTime类型
如果业务需要使用带时区的时间类型,调整注解配置匹配入参,同时指定默认时区:
// pattern改为匹配带T的格式,timezone替换为你实际使用的时区,比如UTC、Asia/Shanghai @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "Asia/Shanghai") private OffsetDateTime createDate = null; @JsonProperty("finish_date") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "Asia/Shanghai") private OffsetDateTime finishDate = null;
如果调整注解后仍然报错,确认项目已引入JSR310时间序列化模块:
<!-- 非SpringBoot项目需手动引入,SpringBoot自带spring-boot-starter-web已默认集成 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> </dependency>
方案2:调整字段类型为LocalDateTime(改动最小)
如果业务不需要时区偏移特性,直接把字段类型从OffsetDateTime改为LocalDateTime,无需额外配置时区,仅调整时间格式即可:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime createDate = null; @JsonProperty("finish_date") @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime finishDate = null;
方案3:要求调用方传入带时区偏移的时间
如果业务要求严格使用带时区的OffsetDateTime,要求调用方传入的时间字符串携带时区偏移,示例格式为2021-04-08T05:00:25+08:00,对应注解配置调整为:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssXXX") private OffsetDateTime createDate = null;
内容的提问来源于stack exchange,提问作者dcm50
相关产品推荐
相关产品推荐

