SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式相关的知识,希望对你有一定的参考价值。
参考技术ASpringBoot(SpringMVC)序列化和反序列化Json时默认使用的是Jackson(例如使用@RequestBody反序列化前端传递过来的Json字符串时),
当我们前端使用Json字符串传递到后台时日期格式可能是时间戳(即long类型的数字),也有可能是日期字符串(如:"yyyy-MM-dd", "yyyy-MM-dd HH:mm", "yyyy-MM-dd HH:mm:ss")等等。
如果是时间戳或者是yyyy-MM-dd格式的日期,Jackson会自动识别并且转换成功,若是yyyy-MM-dd HH:mm:ss这种格式的日期字符串的话,Jackson无法自动转换成Date类型。
这里有几种解决方案,如下:
我们可以在需要被反序列化的日期属性上添加com.fasterxml.jackson.annotation.JsonFormat注解,如下:
这个注解对于Jackson 序列化以及反序列化均起作用 (即将日期对象序列化成Json时格式为以上指定的格式,将Json反序列化成日期时会按照以上指定的日期格式进行解析,若日期字符串的格式不满足以上指定的格式将会直接报错)
方法一我们只能指定一种日期的格式,但是我们前端可能传递各种类型的日期格式,这个时候我们需要自定义Json日期转换器,如下在日期类型的属性上添加com.fasterxml.jackson.databind.annotation.JsonDeserialize注解,如下:
其中DateJacksonConverter类是我们自定义的日期转换类,这时在 反序列化 时我们可以转换多种格式的日期,DateJacksonConverter类定义如下:
在该方法中handledType()方法 可以不用重写。
以上两种方法都需要在实体类上添加注解,这种方式污染了实体类,并且要是类太多的话,添加注解是一个麻烦事,这时我们可以配置全局的日期类型转换器,如下:
采用这种方式我们自定义的DateJacksonConverter 必须重写 handledType()方法。
本人推荐采用方式三,这样不用污染实体类。
以下附上方式三的xml文件配置(若没有使用SpringBoot的话):
Tips:
1.关于使用SpringMVC接受前端传递过来的QueryParameter数据(即后台使用@RequestParam接收)或者formdata数据(后台采用@RequestParam或者直接用对象接收),
若其中存在日期数据,则可以采用以下博客提到的方式进行日期类型的正确转换:
https://my.oschina.net/u/2608182/blog/713435
2.关于Jackson的基本用法参考: https://my.oschina.net/u/2608182/blog/731403
refer to:
https://my.oschina.net/u/2608182/blog/2877624
以上是关于SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式的主要内容,如果未能解决你的问题,请参考以下文章
在 SpringBoot 中使用 @Valid 和 @Requestbody 验证 JSON 对象
springboot中@RequestBody和@ReponseBody获取参数
SpringBoot 实战:在 RequestBody 中优雅的使用枚举参数
SpringBoot中使用@RequestBody时如何自定义需要转换的日期格式
Swagger (Springfox) 仅查找 Controller @RequestBody (Spring Boot) 中使用的模型