使用spring cloud feign进行接口调用时,遇到服务端返回的日期格式不一致问题,比较难要求服务端去整改,只能自己扩展feign客户端反序列化支持各种日期格式了。其中两种日期格式是:2024-09-02T08:05:06.555Z、2025-02-27T15:51:34.813121+08:00
feign默认使用jackson进行序列化和反序列化,那么解决起来也很简单,直接自定义一个ObjectMapper 注入即可
代码如下:
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addDeserializer(LocalDateTime.class, new MultiFormatLocalDateTimeDeserializer());
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
public static class MultiFormatLocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
// 定义支持的多种日期格式
private static final List<DateTimeFormatter> FORMATTERS = Arrays.asList(
new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd[ ]['T']HH:mm:ss")
.appendFraction(ChronoField.MICRO_OF_SECOND, 0, 7, true)
.appendPattern("[XXX][X][Z]")
.toFormatter()
// 下面扩展各种其他日期格式
// DateTimeFormatter.ISO_LOCAL_DATE_TIME,
// DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'+08:00'"),
// DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"),
// DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'")
);
@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
String dateTimeStr = p.getText().trim();
// 尝试用多种格式解析日期时间字符串
for (DateTimeFormatter formatter : FORMATTERS) {
try {
return LocalDateTime.parse(dateTimeStr, formatter);
} catch (Exception e) {
// 如果解析失败,继续尝试下一种格式
}
}
// 如果所有格式都解析失败,抛出异常
throw new IllegalArgumentException("无法解析日期时间字符串: " + dateTimeStr);
}
}