目录
默认情况
在默认情况下,不加任何有关接收Date类型数据的配置时,前端传递Date类型数据至后端接口,控制台出现以下异常:
1 | Failed to convert from type [java.lang.String] to type [java.util.Date] for value |
也就是说,在SpringBoot
中,必须添加某种配置才能让前端正确传递时间类型数据到后端。下面针对不同的情况来介绍一下解决办法。
局部配置——使用@DateTimeFormat
第一种情况,仅需要对某个Bean类的Date类型字段进行转换,那么只需要在Bean类属性上增加@DateTimeFormat()
注解,括号内 pattern
为前端传递的日期格式。比如:
1 | @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
特点–缺陷:
按照如上配置,只能处理形如:2018-11-2 2:22:2
这样固定格式的数据,无法处理时间戳和2018-11-2
格式的数据。如果想要处理2018-11-2
这样的时间,就必须把pattern
改成yyyy-MM-dd
。
可以对不同的属性赋予不同的pattern
,但是对每个Date类型都要加上注解显得比较繁琐,也无法处理单个属性可能对应不同格式的值的情况。
更通用、有效的方式是定义一个时间转换类,并将其应用到所有的接口上。
全局配置——自定义时间转换器
分为两个步骤:
- 编写一个时间转换类,把可能的格式转换为Date类型
- 通过某种方式,将时间转换应用到Spring的所有接口上
时间转换类
1 | import org.springframework.core.convert.converter.Converter; |
将时间转换类应用到接口上
介绍两种方式:使用@Component
+ @PostConstruct
或@ControllerAdvice
+ @InitBinder
第一种方式:
@Component
+ @PostConstruct
1 | import org.springframework.beans.factory.annotation.Autowired; |
第二种方式:
@ControllerAdvice
+ @InitBinder
有关这两个注解的含义请参考我的博客:Spring进阶之@ControllerAdvice与统一异常处理
1 | import com.aegis.config.converter.DateConverter; |
OK,关于SpringBoot处理前端日期传值的问题的相关解决办法就介绍到这里了。