SpringMVC接收json对象时 date对象无法序列化异常的解决办法。

在低版本springMVC中经常出现这种日期转换不支持的异常

Caused by: org.codehaus.jackson.map.JsonMappingException: Can not construct instance of java.util.Date from String value '2019-01-14 12:00:01': not a valid representation (error: Can not parse date "2019-01-14 12:00:01": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))
这异常的意思是jackson的这个jar包不支持"yyyy-MM-dd’T’HH:mm:ss.SSSZ", “yyyy-MM-dd’T’HH:mm:ss.SSS’Z’”, “EEE, dd MMM yyyy HH:mm:ss zzz”, "yyyy-MM-dd"之外的其他日期格式,很傻…的BUG.

1. org.codehaus.jackson

以下就是这BUG的解决办法 前提是使用的jar包是 org.codehaus.jackson 且 springMVC的参数是@RequestBody 注解的,因为如果是表单提交的有其他解决办法,不能通用.
创建一个类继承于org.codehaus.jackson.map.JsonDeserializer,在deserialize方法里自己去转换时间,这里的示范引用了datetime,其实完全可以不用,使用simpledateformat即可,可以在里面做些复杂的判断如:任意对象转换date对象
public class DefaultDate extends JsonDeserializer<Date> {

    @Override
    public Date deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
        if (jp.getText()==null||jp.getText().length()==0) {
            return null;
        }
        return DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss").parseDateTime(jp.getText()).toDate();
    }
}
再在需要转换的类的set方法上加上注解即可
  @JsonDeserialize(using=DefaultDate.class)
    public void setDay(Date day) {
        this.day = day;
    }

2.com.fasterxml.jackson

如果springmvc使用的是com.fasterxml.jackson 的jar包则直接使用一下注解即可
 import com.fasterxml.jackson.annotation.JsonFormat;
 //自己指定日期表达式
 @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
 private Date startTime;

你可能感兴趣的:(spring)