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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值