自定义反序列化
大约 1 分钟javaspring
概述
将前端传递来的日期类型的数据检测多种格式后转换为日期类型,解放前端日期类型的操作(后端兼容传递来的各种格式)
实现
依赖
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-joda</artifactId>
<version>2.9.5</version>
</dependency>
自定义反序列化格式
package account.config;
import Exc.RunTimeErrorException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import org.apache.commons.lang.StringUtils;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.Date;
public class DateDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
try {
return this.deserialize(jsonParser.getText().trim());
} catch (ParseException e) {
throw new RunTimeErrorException("进行日期时间类型的属性反序列化时出现异常!");
}
}
private Date deserialize(String source) throws ParseException {
if (StringUtils.isBlank(source)) {
return null;
}
SimpleDateFormat simpleDateFormat = null;
//yyyy-MM-dd
if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}"))
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
// yyyy-MM-ddTHH:mm:ss.SSSZ
if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{3}Z"))
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd\'T\'HH:mm:ss.SSS\'Z\'");
// yyyy-MM-dd HH:mm:ss
if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}"))
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// yyyy-MM-dd HH:mm:ss.SSS
if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}\\s+\\d{1,2}:\\d{1,2}:\\d{1,2}.\\d{3}"))
simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
if(simpleDateFormat == null) throw new RunTimeErrorException("进行日期时间类型数据反序列化时遇到了没有定义的格式:" + source);
else return simpleDateFormat.parse(source);
}
}
应用
public class Metalbillmain {
private Integer id;
private String billCode;
// @DateTimeFormat(pattern="yyyy-MM-dd")
// @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonDeserialize(using = DateDeserializer.class)
private Date date;
private Integer operatorId;
}
