在springmvc开发controller中,参数绑定时,前端传过来的Date类型是string型(类似‘1550246400000’),这样spring在进行参数绑定时就会抛出无法将string类型转换成Date类型的错误。那么我们该怎么办呢。(如果很急使用可以直接跳到文章最后的终极版本查看最终代码)
springboot中报出的错误文本(仅仅为了能搜索到这边文章,没什么意义)
Field error in object 'advertisement' on field 'advBuyDate': rejected value [1550246400000]; codes [typeMismatch.advertisement.advBuyDate,typeMismatch.advBuyDate,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [advertisement.advBuyDate,advBuyDate]; arguments []; default message [advBuyDate]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'advBuyDate'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '1550246400000'; nested exception is java.lang.IllegalArgumentException]]
参考网上的一些解决办法:我们要使用SpringMVC注解@initbinder解决类型转换问题。网上广泛流传的版本是
@InitBinder
protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
dateFormat.setLenient(false);
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
这样要求我们传过来的string类型要是“yyyy-MM-dd”(2012-12-12)这样的类型才能将之转换为Date类型。但是这不符合我们的转换要求。我们需要将“1550246400000”转换成Long类型,在将之转换成Date类型。所以我们不能使用SimpleDateFormate,需要自己实现DateFormate接口,但是还有一个坑(先别急,我先贴上自己实现的DateFormate的代码)
@InitBinder
protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
// 自定义一个dateFormat,前端传过来的是string形式的1550246400000,转换成date
DateFormat dateFormat = new DateFormat() {
@Override
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
toAppendTo.append(date.getTime()+"");
return toAppendTo;
}
@Override
public Date parse(String source, ParsePosition pos) {
Date date = new Date(Long.parseLong(source));
return date;
}
};
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
这样时候就可以将前端传过来的类似“1550246400000”的string转换为Date类型进而进行参数绑定了。但是你在运行代码后肯定还会出现异常。这是怎么回事呢?在自定的DateFormate中打上断点,我们会发现parse方法并没有问题,可以正确将string转换成Date,但是坑就在DateFormate接口中,他在调用我们自定义的DateFormate后会进行判断,如果pos(就是parse方法的第二个参数)的index=0,就会抛出异常。
// DateFormate接口
public Date parse(String source) throws ParseException
{
ParsePosition pos = new ParsePosition(0);
Date result = parse(source, pos);
if (pos.index == 0)
throw new ParseException("Unparseable date: \"" + source + "\"" ,
pos.errorIndex);
return result;
}
所以我们还需要在自定义的DateFormate中将pos的index改为非0
@InitBinder
protected void init(HttpServletRequest request, ServletRequestDataBinder binder) {
// 自定义一个dateFormat,前端传过来的是string形式的1550246400000,转换成date
DateFormat dateFormat = new DateFormat() {
@Override
public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
toAppendTo.append(date.getTime()+"");
return toAppendTo;
}
@Override
public Date parse(String source, ParsePosition pos) {
Date date = new Date(Long.parseLong(source));
pos.setIndex(source.length());
return date;
}
};
binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
}
可以看出只是加了一个setIndex,再次运行就可以成功绑定参数了。谢谢你的观看,希望能对你提供微不足道的帮助