SpringMVC日期类型参数传递
SpringMVC日期类型参数传递
CAMELLIA日期类型参数传递
日期类型比较特殊,因为对于日期的格式有N多中输入方式,比如:
- 2088-08-18
- 2088/08/18
- 08/18/2088
- ……
针对这么多日期格式,SpringMVC该如何接收?
1. 字符串转日期
步骤1:编写方法接收日期数据
在UserController类中添加方法,把参数设置为日期类型
1 |
|
步骤2:使用PostMan发送请求
使用PostMan发送GET请求,并设置date参数
http://localhost/dataParam?date=2088/08/08
步骤3:查看控制台
通过打印,我们发现SpringMVC可以接收日期数据类型,并将其打印在控制台。如果把日期参数的格式改成其他的,SpringMVC还能处理么?
步骤4:更换日期格式
为了能更好的看到程序运行的结果,我们在方法中多添加一个日期参数
1 |
|
使用PostMan发送请求,携带两个不同的日期格式,
http://localhost/dataParam?date=2088/08/08&date1=2088-08-08
发送请求和数据后,页面会报400,控制台会报出一个错误
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 ‘2088-08-08’; nested exception is java.lang.IllegalArgumentException]
从错误信息可以看出,错误的原因是在将2088-08-08
转换成日期类型的时候失败了,原因是SpringMVC默认支持的字符串转日期的格式为yyyy/MM/dd
,而我们现在传递的不符合其默认格式,SpringMVC就无法进行格式转换,所以报错。
解决方案也比较简单,需要使用@DateTimeFormat
1 |
|
重新启动服务器,重新发送请求测试,SpringMVC就可以正确的进行日期转换了
*步骤5:携带时间的日期
接下来我们再来发送一个携带时间的日期,看下SpringMVC该如何处理?
先修改UserController类,添加第三个参数
1 |
|
使用PostMan发送请求,携带两个不同的日期格式,
http://localhost/dataParam?date=2088/08/08&date1=2088-08-08&date2=2088/08/08 8:08:08
重新启动服务器,重新发送请求测试,SpringMVC就可以将日期时间的数据进行转换
2. 总结
知识点1:@DateTimeFormat
名称 | @DateTimeFormat |
---|---|
类型 | ==形参注解== |
位置 | SpringMVC控制器方法形参前面 |
作用 | 设定日期时间型数据格式 |
相关属性 | pattern:指定日期时间格式字符串 |
内部实现原理
讲解内部原理之前,我们需要先思考个问题:
前端传递字符串,后端使用日期Date接收
前端传递JSON数据,后端使用对象接收
前端传递字符串,后端使用Integer接收
- 后台需要的数据类型有很多中
在数据的传递过程中存在很多类型的转换
问:谁来做这个类型转换?
答:SpringMVC
问:SpringMVC是如何实现类型转换的?
答:SpringMVC中提供了很多类型转换接口和实现类
在框架中,有一些类型转换接口,其中有:
- (1) Converter接口
1 | /** |
注意:Converter所属的包为org.springframework.core.convert.converter
Converter接口的实现类
框架中有提供很多对应Converter接口的实现类,用来实现不同数据类型之间的转换,如:
请求参数年龄数据(String→Integer)
日期格式转换(String → Date)
- (2) HttpMessageConverter接口
该接口是实现对象与JSON之间的转换工作
注意:SpringMVC的配置类把@EnableWebMvc当做标配配置上去,不要省略