现象
在一个项目中同时存在下面这2种情况,传递日期格式数据的时候,格式可能是yyyy-MM-dd HH:mm:ss 也有可能是yyyy-MM-ddTHH:mm:ss;
如:2022-10-15 00:00:00 或者 2022-10-15T00:00:00
如果直接使用默认提供的jackson配置 那么只能支持 其中一种,不能两种都兼容
解决方式
1.编写自己的日期格式化类
import com.fasterxml.jackson.databind.util.StdDateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MySimpleDateFormat extends SimpleDateFormat {
private StdDateFormatstdDateFormat = new StdDateFormat();
public MySimpleDateFormat() {
// 设置默认的日期格式
super("yyyy-MM-dd HH:mm:ss");
}
@Override
public Date parse(String dateStr) throws ParseException {
if (dateStr != null && !dateStr.contains("T")) {
return super.parse(dateStr);
}
return stdDateFormat.parse(dateStr);
}
@Override
public Object clone() {
MySimpleDateFormat other = (MySimpleDateFormat )super.clone();
other.stdDateFormat = new StdDateFormat();
return other;
}
}
2.使用自己的日期格式化类代替原本的格式化类
修改application.properties 配置
spring.jackson.date-format=demo.spring.mvc.MySimpleDateFormat
原理
首先想一个问题 为什么我们通过配置spring.jackson.date-format 可以改变日期格式化的行为,
通过这个属性作为切入点,我们很容易找到JacksonAutoConfiguration这个类,
然后我们找到这个方法,
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.Jackson2ObjectMapperBuilderCustomizerConfiguration.StandardJackson2ObjectMapperBuilderCustomizer#configureDateFormat
只要看到这个方法里面的ClassUtils.forName ,再加上我们超强的个人能力,dateFormat神秘的面纱就被我们轻松掀开。