跳至主要內容

自定义反序列化

chanchaw大约 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;
}