SpringMVC Date类型参数解析

本文详细探讨了SpringMVC在处理前端传递的Date数据时的三种方式:@RequestBody、@RequestParam及无注解。针对每种方式,文章分析了Date作为单独参数和对象属性时的处理过程,解释了默认情况下日期字符串和时间戳的转换问题,以及如何通过实现日期转换接口或使用Converter解决这些问题。此外,还深入解析了SpringMVC中HandlerMethodArgumentResolver和HttpMessageConverter在参数解析过程中的作用。
摘要由CSDN通过智能技术生成

前端向后端传递Date数据,后端有三种实现方式,@RequestBody注解、@RequestParam注解和不加注解。日期数据的形式也有两种,时间戳和日期字符串。

情况一:后端用@RequestBody注解标记。在这种情况下,Date又可以分两种数据存在方式:一种是单独作为接口的参数来传递,另外一种是作为参数对象属性来传递。

1.Date类型数据单独作为接口的参数传递。在默认情况(不实现任何日期转换接口或方法)下,前端向后端传递日期数据时,前端日期数据需要转换成时间戳,代码如下所示。如果前端向后端传的数据是日期字符串,会抛出相应的异常(Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): Expected space separating root-level values,我这里的日期格式是:“yyyy-MM-dd HH:mm:ss”)。如果在不实现任何日期转换接口或方法情况下,想要实现前端向后端传递日期字符串的功能,后端只能将日期类型参数封装到参数对象中,作为Date作为参数对象的属性来传递。

   示例代码1 (Date单独作为接口的参数)

    @Test

    public void testRequestBodyDateTest() {

        String params = "1608537480434";

        String jsonStr = StringUtils.replaceSingleQuoteWithDouble(params);

                    this.postBody("/testRequestBodyDate/", jsonStr);

    }

    @PutMapping("/testRequestBodyDate/")

    public CommonResult  testRequestBodyDate(@RequestBody Date test){

        logger.info("testRequestBodyDate");

        return CommonResult.success(test);

    }

 

2.Date类型数据作为参数对象属性传递。在默认情况(不实现任何日期转换接口或方法)下,前端的日期数据只能是日期字符串,代码如下所示。如果是时间戳,org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `java.util.Date` from String "1608537480434": not a valid representation (error: Failed to parse Date value '1608537480434': Unparseable date: "1608537480434");。

示例代码2 (Date作为参数对象属性)

    @Test

    public void testBodyTest() {

        String params = "{intTest':1,'longTest':0,'dateTest':'2020-12-21 15:58:00'}";

        String jsonStr = StringUtils.replaceSingleQuoteWithDouble(params);

                    this.postBody("/testRequestBody/", jsonStr);

    }


    @PostMapping("/testRequestBody/")

    public CommonResult  testBody(@RequestBody TestObject testObject){

        logger.info("testBody");

        return CommonResult.success(testObject);

    }

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值