package com.ecep.contract.config; import java.io.IOException; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; /** * 自定义LocalDateTime反序列化器,支持多种格式 */ class CustomLocalDateTimeDeserializer extends StdDeserializer { private final List formatters; public CustomLocalDateTimeDeserializer() { super(LocalDateTime.class); // 支持多种日期时间格式 this.formatters = new ArrayList<>(); // ISO标准格式,2011-12-03T10:15:30 this.formatters.add(DateTimeFormatter.ISO_LOCAL_DATE_TIME); // 项目默认格式 yyyy-MM-dd HH:mm:ss this.formatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); // 其他可能的格式 this.formatters.add(DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); this.formatters.add(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss")); this.formatters.add(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm")); this.formatters.add(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")); } @Override public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException { String value = p.getText().trim(); if (value == null || value.isEmpty()) { return null; } // 尝试使用各种格式解析 for (DateTimeFormatter formatter : formatters) { try { return LocalDateTime.parse(value, formatter); } catch (Exception e) { // 尝试下一种格式 continue; } } // 如果所有格式都失败,尝试使用ISO_INSTANT格式(可能是时间戳字符串) try { return LocalDateTime.ofInstant(Instant.parse(value), ZoneId.systemDefault()); } catch (Exception e) { // 仍然失败,抛出异常 throw new JsonParseException(p, "无法解析为LocalDateTime: " + value); } } }