@DateTimeFormat和@JsonFormat介绍

这篇具有很好参考价值的文章主要介绍了@DateTimeFormat和@JsonFormat介绍。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该文章已同步收录到我的博客网站,欢迎浏览我的博客网站,xhang’s blog

1.@DateTimeFormat注解

1.1@DateTimeFormat注解简介

@DateTimeFormat注解是由Spring提供的一个注解,位于Spring和核心组件之一的context组件。对应的所需依赖如下:

# SpringBoot对应的依赖
	<dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

# Spring对应的依赖
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
        </dependency>

双击shift快捷键,全局搜索DateTimeFormat,查看外部库,DateTimeFormat本质上是一个接口

@DateTimeFormat和@JsonFormat介绍

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})
public @interface DateTimeFormat {
   String style() default "SS";

   ISO iso() default ISO.NONE;

   String pattern() default "";

   String[] fallbackPatterns() default {};
    
   enum ISO {
      DATE,
      TIME,
      DATE_TIME,
      NONE
   }
}

1.2@DateTimeFormat注解的功能

@DateTimeFormat注解的功能是将一个日期字符串转化为对应的Date类型,主要处理前端时间类型与后端pojo对象中的成员变量进行数据绑定在注解属性patttern中所约束的时间格式并不会影响后端返回前端的时间类型数据格式。

DateTimeFormat接口的pattern属性:

pattern属性类型为String类型,用于格式化字段或方法参数的自定义模式。默认为空字符串,表示没有指定自定义模式字符串。

当然也可以使用自定义日期模式字符串,如yyyy-MM-dd HH:mm:ss

1.3@DateTimeFormat注解的注意点

  • @DateTimeFormat注解既可以作用于pojo类型的属性上,也可以作用于方法参数上。

  • 前端传入的时间类型的字符串要和pattern属性所规定的规则相同。

  • @DateTimeFormat注解只能处理非JSON数据格式的字符串(如url-String格式、Form-Data格式),如果要处理JSON数据格式,就需要采用@RequestBody注解,@RequestBody就是获取请求体中的内容(即JSON字符串),再通过JSON解析库(如Jackson、FatJosn)将JSON字符串转换为pojo对象。

    ​ 两种JSON解析库所需依赖:

        <!--       fastjson所需依赖 -->
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.54</version>
        </dependency>

​ Jackson由于是Spring提供的,所以它所需的依赖就在Spring依赖中。

  • @DateTimeFormat注解只是解析日期字符串转为Date类型,转换后的日期格式并不会受到@DateTimeFormat注解中pattern属性的约束。

1.4@DateTimeFormat功能演示

1.4.1类型转换异常情况测试

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    private Date birthday;
}
  1. controller层
@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {

    @GetMapping("/exception")
    public User dft1(User user){
      log.info( "用户信息是:" + user);
      return user;
    }
}
  1. 用ApiFox进行接口测试,传输的数据格式为url路径传参

@DateTimeFormat和@JsonFormat介绍

请求400,查看控制台日志信息

@DateTimeFormat和@JsonFormat介绍

报错信息:即String类型转换为Date类型失败

Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘birthday’; nested exception is org.springframework.core.convert

1.4.2接收url路径传参格式测试

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
}
  1. 用ApiFox进行接口测试,传输的数据格式为url路径传参

​ 查看响应情况和控制台输出情况:可以发现@DateTimeFormat注解对日期字符串进行了解析,转换为对应的Date类型

但是要注意@DateTimeFormat注解只是解析日期字符串转为Date类型,转换后的日期格式并不会受到@DateTimeFormat注解中pattern属性的约束

@DateTimeFormat和@JsonFormat介绍

​ 响应的JSON字符串数据如下:

@DateTimeFormat和@JsonFormat介绍

1.4.3接收Form-Data数据格式测试

  1. pojo和controller都不变

  2. 用ApiFox进行接口测试,传输的数据格式为Form-Data类型

    @DateTimeFormat和@JsonFormat介绍

  3. 测试结果:

    @DateTimeFormat和@JsonFormat介绍

    响应的JSON字符串数据如下:

@DateTimeFormat和@JsonFormat介绍

1.4.4接收JSON数据格式测试

​ 接受JSON数据格式时,在接收参数时,通过@RequestBody获取请求体中的内容(即JSON字符串),再通过JSON解析库(如Jackson、FatJosn)将JSON字符串转换为pojo对象

  1. pojo层不变
  2. controller层

通过FastJson处理JSON数据,fastjson默认使用的序列化格式就是:

DEFFAULT_DATE_FORMAT = “yyyy-MM-dd HH:mm:ss”;

@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {
    @GetMapping("/exception")
    public User dft1(@RequestBody String userMsg) {
        JSONObject jsonObject = new JSONObject();
        User user = JSONObject.parseObject(userMsg, User.class);
        log.info("用户信息是:" + user);
        return user;
    }
}
  1. 用ApiFox进行接口测试,传输的数据格式为JSON类型

@DateTimeFormat和@JsonFormat介绍

  1. 测试结果:

    @DateTimeFormat和@JsonFormat介绍

​ 响应的JSON字符串数据如下:

@DateTimeFormat和@JsonFormat介绍

  1. 使用JSON解析库Jackson进行解析JSON数据

  2. controller层

@GetMapping("/exception")
public User dft1(@RequestBody String userMsg) {
    ObjectMapper objectMapper = new ObjectMapper();
    User user = null;
    try {
        user = objectMapper.readValue(userMsg, User.class);
    } catch (JsonProcessingException e) {
        e.printStackTrace();
    }
    log.info("用户信息是:" + user);
    return user;
}
  1. 用ApiFox进行接口测试,传输的数据格式为JSON类型

@DateTimeFormat和@JsonFormat介绍

  1. 测试结果

​ 控制台报错,错误信息提示反序列化失败,因为jackson默认的日期反序列不支持yyyy-MM-dd HH:mm:ss 这种格式,而是默认"yyyy-MM-dd’T’HH:mm:ss.SSSX",所以反序列化失败。@DateTimeFormat和@JsonFormat介绍

​ 这就引出了今天要介绍的另一个注解@JsonFormat

2.@JsonFormat注解

2.1@JsonFormat注解简介

​ @JsonFormat注解是由Jackson提供的一个注解,位于Jackson的annotation包中,本身也是一个接口

所对应的依赖如下:

<!--Jackson包-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

​ SpringBoot的web依赖默认内置的有Jackson相应依赖。

@DateTimeFormat和@JsonFormat介绍

2.2@JsonFormat注解的功能

@JsonFormat注解的功能是处理请求中的JSON日期字符串和查询数据库中的日期类型。即可约束时间类型的请求格式和响应格式。

JsonFormat接口的pattern属性:

pattern属性类型为String类型,用于格式化字段或方法参数的自定义模式。默认为空字符串,表示没有指定自定义模式字符串。

当然也可以使用自定义日期模式字符串,如yyyy-MM-dd HH:mm:ss

JsonFormat接口的timezone属性:

东八区([UTC]/[GMT]+08:00)是比[世界协调时间](UTC)/[格林尼治时间](GMT)快8小时的时区,我国就是属于东八区,所以要指定时区为"GMT+8"

2.3@JsonFormat注解的注意点

  • @JsonFormat只能作用在实体类上,不能作用于方法参数上。
  • @JsonFormat会根据pattrn属性约束日期格式,在返回数据时会返回约束日期格式,这点和@DateTimeFormat不同
  • @JsonFormat注解当需要处理前端传来的数据时,先通过@RequestBody将入参参数映射到实体后,@JsonFormat注解才能去对时间格式进行约束;

2.4@JsonFormat功能演示

2.4.1处理前端传递的日期字符串

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
    private String username;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date birthday;
}
  1. controller层
@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {

    @GetMapping("/exception")
    public User dft1(@RequestBody String userMsg) {
        ObjectMapper objectMapper = new ObjectMapper();
        User user = null;
        try {
            user = objectMapper.readValue(userMsg, User.class);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        log.info("用户信息是:" + user);
        return user;
    }
}
  1. 测试结果:

@DateTimeFormat和@JsonFormat介绍

​ 响应的JSON字符串数据如下:

可以发现@JsonFormat注解可以根据pattern属性对返回的数据进行约束

@DateTimeFormat和@JsonFormat介绍

2.4.2处理查询数据库中的datatime类型格式

  1. 数据库中的数据格式为datatime类型

@DateTimeFormat和@JsonFormat介绍

  1. 先测试不添加@JsonFormat注解时的情况,发送请求,查询数据库,查看响应的JSON数据

    @DateTimeFormat和@JsonFormat介绍

@DateTimeFormat和@JsonFormat介绍

  1. 添加@JsonFormat注解再次进行测试

    ​ 数据格式转换成功

@DateTimeFormat和@JsonFormat介绍

3.总结

  • 当处理的数据格式为非JSON格式(url路径传参、Form-Data)的时候适合使用@DateTimeFormat注解进行处理,就是格式化后的日期格式并不会按照属性pattern中所约束的格式响应,如果想要规定日期格式,可采用SimpleDateFormat对象进行处理。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = simpleDateFormat.format(user.getBirthday());
System.out.println(date);

@DateTimeFormat和@JsonFormat介绍文章来源地址https://www.toymoban.com/news/detail-428723.html

  • 当处理的数据格式为JSON数据格式时适合使用@JsonFormat注解进行处理,如果是前端返回的JSON日期字符串,需要使用@RequestBody注解获取请求体中的JSON字符串,再通过JSON解析库将JSON字符串转换为对应的POJO类型。或者是从数据库中查出对应的DateTime类型时对类型进行转换。

到了这里,关于@DateTimeFormat和@JsonFormat介绍的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 未被搜索引擎收录的文章:采集难题揭秘

    未被收录的文章能采集吗?这是一个备受争议的话题。作为一名资深网络编辑,我在这里分享一下我的观点和经验。 1.什么是未被收录的文章 2.为什么有些文章未被收录 3.未被收录的文章是否能采集 4.采集未被收录的文章可能面临的问题 5.如何合法采集未被收录的文章 6.为什

    2024年02月03日
    浏览(44)
  • 记录第一篇被”华为开发者联盟鸿蒙专区 “收录的文章

    记录第一篇被”华为开发者联盟鸿蒙专区 “社区收录的文章。 坚持写作的动力是什么? 是记录、分享,以及更好的思考 。  

    2024年02月14日
    浏览(37)
  • 【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|

    1.1 索引目的 本篇索引旨在 收藏CSDN全站中有关数字IC领域高价值文章 ,在数字芯片领域中,就算将架构,设计,验证,DFT,后端诸多岗位加在一起的数量,都不及软件类一个细分方向的岗位数量多,反映在社区氛围或是开源资料的丰富度而言,数字IC领域相较于软件/互联网领

    2024年02月03日
    浏览(117)
  • 还在手动复制文章吗?教你如何一键将文章从notion同步到WordPress

    本文会给大家介绍如何在WordPress上安装一个插件,实现将notion上写的文章自动同步到WordPress上,从而提高写作效率,接下来请跟随我的脚步一起来操作吧! 在WordPress后台添加新插件页面中搜索“notion”,选择如下图红框勾选的插件“WP Sync for Notion”进行安装。 插件安装成功

    2024年01月20日
    浏览(50)
  • @DateTimeFormat注解

    前言 前言在使用@DateTimeFormat进行格式化注解时,总是不能匹配前端传入的。格式总是报错 我这里使用的是pattern进行解析的的但是前端是给我传入的ISO类型的导致不能匹配所以总是报错。后来我们进行查看源码得到了答案。 源码解析 看下源码解析: 那么我们来看下。后端使

    2023年04月08日
    浏览(32)
  • 织梦栏目有缓存导致刚发布的文章条数和分页不同步处理方法

    刚做一个网站需要大量填充数据,发觉得新增的数据没有即时同步到栏目文章分页里 如图: 图2: 分页对不上,经查,由于缓存问题要等1个小时可以自动变正常,或手工用ftp把data》cache里所有文件清空,也可以解决,如果不想每次都手工清理,可以通过改文件,使之不用缓

    2024年02月02日
    浏览(55)
  • 文章同步--飞鹤官方商城加密逆向分析(小程序)、蝉管家滑块加密参数逆向分析

    飞鹤官方商城加密逆向分析(小程序)       蝉管家滑块加密参数逆向分析      

    2024年02月12日
    浏览(223)
  • 记一次DateTimeFormat注解的坑

    背景 :在用Echarts做图表时,前端传两个日期参数,获取日期区间的图表数据。想遵循RESTful风格,所以使用get请求获取date参数。前端读取当前日期,将七天前日期和当前日期作为参数传给后端,后端通过Date参数接收。然后后端报错,无法识别前端的date参数。经查阅,可以通

    2024年01月19日
    浏览(37)
  • @JsonFormat 使用方法

    @JsonFormat用来表示json序列化的一种格式或者类型 例如: 二、为什么用@JsonFormat    @JsonFormat注解 是一个 时间格式化注解 ,比如我们存储在mysql中的数据是date类型的,当我们读取出来封装在实体类中的时候,就会变成英文时间格式,而不是yyyy-MM-dd HH:mm:ss这样的中文时间,因

    2024年02月02日
    浏览(46)
  • SpringBoot复习(30):@DateTimeFormat注解的使用

    一、实体类 二、控制器类:

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包