yyyy-MM-dd HH:mm:ss 这种格式的日期在项目中非常的常用,但是SpringBoot使用个jackson却默认不支持这种日期的反序列化,那就只有我们自己来实现它了,非常的简单粗暴..
我们只需要覆盖jackson的objectMapper类里边的dateFormat即可,直接上代码
定义扩展的dateformat类
import java.text.DateFormat;
import java.text.FieldPosition;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* .扩展jackson日期格式化支持格式
*/
public class ObjectMapperDateFormatExtend extends DateFormat {
private static final long serialVersionUID = 1L;
private DateFormat dateFormat;
private SimpleDateFormat format1 = new SimpleDateFormat("yyy-MM-dd HH:mm:ss");
public ObjectMapperDateFormatExtend(DateFormat dateFormat) {//构造函数传入objectmapper默认的dateformat
this.dateFormat = dateFormat;
}
//序列化时会执行这个方法
@Override
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
return dateFormat.format(date,toAppendTo,fieldPosition);
}
//反序列化时执行此方法,我们先让他执行我们自己的format,如果异常则执执行他的
//当然这里只是简单实现,可以有更优雅的方式来处理更多的格式
@Override
public Date parse(String source, ParsePosition pos) {
Date date;
try {
date = format1.parse(source, pos);
} catch (Exception e) {
date = dateFormat.parse(source, pos);
}
return date;
}
//此方法在objectmapper 默认的dateformat里边用到,这里也要重写
@Override
public Object clone() {
DateFormat dateFormat = (DateFormat) this.dateFormat.clone();
return new ObjectMapperDateFormatExtend(dateFormat);
}
}
覆盖objectmapper默认的dateformat
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
DateFormat dateFormat = objectMapper.getDateFormat();
objectMapper.setConfig(objectMapper.getDeserializationConfig().with(new ObjectMapperDateFormatExtend(dateFormat)));//反序列化扩展日期格式支持
return objectMapper;
}
这里只是让反序列化的时候使用我们自己定义的方式执行,如果想要在序列化的时候也使用的话,直接设置dateformat即可
objectMapper.setDateFormat(new ObjectMapperDateFormatExtend(dateFormat));
注意:这里只是反序列化日期格式支持,可能有时区问题,可以根据自己需要,在format的时候添加时区信息