测试中ObjectMapper反序列化dd.MM.yyyy HH:mm:ss为OffsetDateTime失败
问题根源
你遇到的报错核心原因是:OffsetDateTime必须包含时区偏移信息,但JSON返回的时间字符串(如18.04.2023 10:33:44)里没有时区,Java无法凭空生成ZoneOffset,因此直接解析会失败。
解决方案
以下三种方法都能解决这个问题,按需选择:
方案1:修复自定义反序列化器
先将字符串解析为不带时区的LocalDateTime,再指定业务需要的时区转换为OffsetDateTime:
private class CustomDeserializer extends JsonDeserializer<OffsetDateTime> { private DateTimeFormatter formatter; // 可根据业务场景指定固定时区,比如UTC、Europe/Moscow,或用系统默认时区ZoneId.systemDefault() private final ZoneId targetZone = ZoneId.of("UTC"); public CustomDeserializer(DateTimeFormatter formatter) { this.formatter = formatter; } @Override public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException { String dateStr = parser.getText(); // 先解析为LocalDateTime(不带时区) LocalDateTime localDateTime = LocalDateTime.parse(dateStr, formatter); // 指定时区转换为OffsetDateTime return localDateTime.atZone(targetZone).toOffsetDateTime(); } }
方案2:用@JsonFormat注解指定时区
直接在POJO的createDate字段上添加带时区的注解,无需自定义反序列化器:
// 示例:指定为UTC时区,可替换为业务实际需要的时区(如"Europe/Moscow") @JsonFormat(pattern = "dd.MM.yyyy HH:mm:ss", timezone = "UTC") private OffsetDateTime createDate;
同时确保ObjectMapper注册了JavaTimeModule:
ObjectMapper objectMapper = JsonMapper.builder() .configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false) .configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false) .addModule(new JavaTimeModule()) .build();
方案3:全局配置Jackson时区
如果不想逐个字段配置,可在Spring Boot配置文件中设置全局时区:
spring: jackson: time-zone: UTC # 替换为业务实际时区 serialization: write-dates-as-timestamps: false
此配置会对所有日期类型的序列化/反序列化生效,包括OffsetDateTime。
内容的提问来源于stack exchange,提问作者Nik Korn
相关产品推荐
相关产品推荐

