在低版本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;