SpringMVC Get请求如何获取Date类型的参数—— @DateTimeFormat

时间:2024-04-04 09:49:36

Get请求如何获取Date类型的参数

背景介绍

今天Code Review的时候发现一个小问题,发现部分接口(Get)接收前端传递的时间类型用的是String类型的然后再到代码中转换成Date类型.
我提出我的疑惑:“嘿、boy 这地方为啥要用String 接收开始时间和结束时间?”
boyA:“不用String 直接用Date会报错啊!难道你们不用String?”
boyB一脸懵逼加略带嘲讽回到:“怎么可能报错?我这边都直接用Date接收的,你看…”,熟练的打开项目
boyA看完后回复:“你这不对啊,查询接口用Post?不符合rest风格啊!要用get、get、get!”
boyB…装逼失败反被艹。

首先我们来看看直接使用Date类型接收Get请求中的会发生什么

下面是请求与后台的报错日志

    @GetMapping("/v1/date/test_a")
    @ApiOperation(value = "/v1/date/test_a" , notes = "错误案例")
    @ApiImplicitParam(paramType = "query",name = "startTime", value = "时间[yyyy-MM-dd HH:mm:ss]", dataType = "Date",defaultValue = "2019-03-14 14:00:00")
    public Response<Date> dateA(@RequestParam("startTime") Date startTime){
        return ResponseUtil.getSuccessResponse(startTime);
    }

SpringMVC Get请求如何获取Date类型的参数—— @DateTimeFormat
SpringMVC Get请求如何获取Date类型的参数—— @DateTimeFormat

@DateTimeFormat

好了本篇博客主角上场,使用方法:
@DateTimeFormat(pattern = “yyyy-MM-dd”)
@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
指定前端传递的格式即可
代码demo:

    @GetMapping("/v1/date/test_b")
    @ApiOperation(value = "/v1/date/test_b" , notes = "成功案例 Date [yyyy-MM-dd]")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", name = "startDate", value = "时间[yyyy-MM-dd]", dataType = "Date", defaultValue = "2019-03-14"),
            @ApiImplicitParam(paramType = "query", name = "endDate", value = "时间[yyyy-MM-dd]", dataType = "Date", defaultValue = "2019-03-15")
    })
    public Response<String[]> dateB(@RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
                                           @RequestParam("endDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE)  Date endDate){
        return ResponseUtil.getSuccessResponse(new String[]{DateUtils.parseDate(startDate,DateUtils.YYYY_MM_DD),DateUtils.parseDate(endDate,DateUtils.YYYY_MM_DD)});
    }

    @GetMapping("/v1/date/test_c")
    @ApiOperation(value = "/v1/date/test_c" , notes = "成功案例 DateTime [yyyy-MM-dd HH:mm:ss]")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", name = "startDate", value = "时间[yyyy-MM-dd HH:mm:ss]", dataType = "Date", defaultValue = "2019-03-14 14:00:00"),
            @ApiImplicitParam(paramType = "query", name = "endDate", value = "时间[yyyy-MM-dd HH:mm:ss]", dataType = "Date", defaultValue = "2019-03-15 14:00:00")
    })
    public Response<String[]> dateC(@RequestParam("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startDate,
                                           @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endDate){
        return ResponseUtil.getSuccessResponse(new String[]{DateUtils.parseDate(startDate,"yyyy-MM-dd HH:mm:ss"),DateUtils.parseDate(endDate,"yyyy-MM-dd HH:mm:ss")});
    }

@DateTimeFormat注解也可以直接写在实体类对象中的成员变量上。

SpringMVC Get请求如何获取Date类型的参数—— @DateTimeFormat最后boyA and boyB手牵手携手共进