springmvc中controller中参数绑定String到Date转换问题(其实是TimeStamp到Date的转换问题)

    在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,再次运行就可以成功绑定参数了。谢谢你的观看,希望能对你提供微不足道的帮助

你可能感兴趣的:(springmvc中controller中参数绑定String到Date转换问题(其实是TimeStamp到Date的转换问题))