SpringMVC项目请求(日期类型参数传递)

前面处理过简单数据类型、POJO数据类型、数组和集合数据类型以及JSON数据类型,接下来处理一种开发中比较常见的一种数据类型,日期类型

日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如:

  • 2022-11-05
  • 2022/11/05
  • 11/05/2022

针对这么多日期格式,SpringMVC该如何接收,它能很好的处理日期类型数据么?

步骤1:编写方法接收日期数据

在UserController类中添加方法,把参数设置为日期类型

    @RequestMapping("/dateParam")
    @ResponseBody
    public String dateParam(Date date){
        System.out.println("date 参数传递 ==> " + date);
        return date.toString();
    }

步骤2:启动Tomcat服务器

SpringMVC项目请求(日期类型参数传递)_第1张图片

步骤3:使用PostMan发送请求

使用PostMan发送GET请求,并设置date参数

http://localhost/springmvc/user/dateParam?date=2022/11/05

SpringMVC项目请求(日期类型参数传递)_第2张图片

步骤4:查看控制台

SpringMVC项目请求(日期类型参数传递)_第3张图片

发送请求和数据后,页面会报400,控制台会报出一个错误

[WARNING] Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.sql.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.sql.Date] for value '2022/11/05'; nested exception is java.lang.IllegalArgumentException]

从错误信息可以看出,Date导入的包错误了,应该导入java.util.Date ,更换包后运行:

SpringMVC项目请求(日期类型参数传递)_第4张图片

通过打印,我们发现SpringMVC可以接收日期数据类型,并将其打印在控制台。

这个时候,我们就想如果把日期参数的格式改成其他的,SpringMVC还能处理么?

步骤5:更换日期格式

为了能更好的看到程序运行的结果,我们在方法中多添加一个日期参数

@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,Date date1)
    System.out.println("参数传递 date ==> "+date);
    return "{'module':'data param'}";
}

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/springmvc/user/dateParam?date=2022/11/05&date2=2022-11-05

SpringMVC项目请求(日期类型参数传递)_第5张图片

发送请求和数据后,页面会报400,控制台会报出一个错误

[WARNING] Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type 'java.lang.String' to required type 'java.util.Date'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-11-05'; nested exception is java.lang.IllegalArgumentException]

从错误信息可以看出,错误的原因是在将2022-11-05转换成日期类型的时候失败了,原因是SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd,而我们现在传递的不符合其默认格式,SpringMVC就无法进行格式转换,所以报错。

解决方案也比较简单,需要使用@DateTimeFormat

    @RequestMapping("/dateParam")
    @ResponseBody
    public String dateParam(Date date,@DateTimeFormat(pattern = "yyyy-MM-dd") Date date2){
        System.out.println("date 参数传递 ==> " + date);
        System.out.println("date2 参数传递 ==> " + date2);
        return date.toString();
    }

重新启动服务器,重新发送请求测试,SpringMVC就可以正确的进行日期转换了

SpringMVC项目请求(日期类型参数传递)_第6张图片

步骤6:携带时间的日期

接下来我们再来发送一个携带时间的日期,看下SpringMVC该如何处理?

先修改UserController类,添加第三个参数

    @RequestMapping("/dateParam")
    @ResponseBody
    public String dateParam(Date date,
                            @DateTimeFormat(pattern = "yyyy-MM-dd") Date date2,
                            @DateTimeFormat(pattern = "yyyy/MM/dd hh:mm:ss")Date date3){
        System.out.println("date 参数传递 ==> " + date);
        System.out.println("date2 参数传递 ==> " + date2);
        System.out.println("date3 参数传递 ==> " + date3);
        return date.toString();
    }

使用PostMan发送请求,携带两个不同的日期格式,

http://localhost/springmvc/user/dateParam?date=2022/11/05&date2=2022-11-05&date3=2022/11/05 11:29:30

SpringMVC项目请求(日期类型参数传递)_第7张图片

重新启动服务器,重新发送请求测试,SpringMVC就可以将日期时间的数据进行转换

SpringMVC项目请求(日期类型参数传递)_第8张图片

知识点1:@DateTimeFormat

名称 @DateTimeFormat
类型 形参注解
位置 SpringMVC控制器方法形参前面
作用 设定日期时间型数据格式
相关属性 pattern:指定日期时间格式字符串

内部实现原理

介绍内部原理之前,我们需要先思考个问题:

  • 前端传递字符串,后端使用日期Date接收
  • 前端传递JSON数据,后端使用对象接收
  • 前端传递字符串,后端使用Integer接收
  • 后台需要的数据类型有很多中
  • 在数据的传递过程中存在很多类型的转换

问:谁来做这个类型转换?

答:SpringMVC

问:SpringMVC是如何实现类型转换的?

答:SpringMVC中提供了很多类型转换接口和实现类

在框架中,有一些类型转换接口,其中有:

  • (1) Converter接口
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.core.convert.converter;

import org.springframework.lang.Nullable;

@FunctionalInterface
public interface Converter<S, T> {
    @Nullable
    T convert(S var1);
}

注意:Converter所属的包为org.springframework.core.convert.converter

Converter接口的实现类

SpringMVC项目请求(日期类型参数传递)_第9张图片

框架中有提供很多对应Converter接口的实现类,用来实现不同数据类型之间的转换,如:

请求参数年龄数据(String→Integer)

日期格式转换(String → Date)

  • (2) HttpMessageConverter接口

该接口是实现对象与JSON之间的转换工作

注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略


项目代码

  • gitee 代码下载

  • github 代码下载

你可能感兴趣的:(SpringMVC,java,postman,spring)