@DateTimeFormat和@JsonFormat介绍

news/2024/4/27 10:53:24/文章来源:https://blog.csdn.net/qq_52030824/article/details/127634546

文章目录

  • 1.@DateTimeFormat注解
    • 1.1@DateTimeFormat注解简介
    • 1.2@DateTimeFormat注解的功能
    • 1.3@DateTimeFormat注解的注意点
    • 1.4@DateTimeFormat功能演示
      • 1.4.1类型转换异常情况测试
      • 1.4.2接收url路径传参格式测试
      • 1.4.3接收Form-Data数据格式测试
      • 1.4.4接收JSON数据格式测试
  • 2.@JsonFormat注解
    • 2.1@JsonFormat注解简介
    • 2.2@JsonFormat注解的功能
    • 2.3@JsonFormat注解的注意点
    • 2.4@JsonFormat功能演示
  • 3.总结

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本质上是一个接口

@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路径传参

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

报错信息:即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属性的约束

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

image-20221101094616306

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

  1. pojo和controller都不变

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

    image-20221101100039452

  3. 测试结果:

    image-20221101100453834

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

image-20221101100026884

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类型

image-20221101100403098

  1. 测试结果:

    image-20221101134006337

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

image-20221101134015537

  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类型

image-20221101100403098

  1. 测试结果

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

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

2.@JsonFormat注解

2.1@JsonFormat注解简介

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

image-20221101140321883

所对应的依赖如下:

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

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

image-20221101140228746

2.2@JsonFormat注解的功能

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

JsonFormat接口的pattern属性:

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

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

JsonFormat接口的timezone属性:

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

2.3@JsonFormat注解的注意点

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

2.4@JsonFormat功能演示

  1. pojo层
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {private String username;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GTM+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. 测试结果:

image-20221101144019882

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

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

image-20221101144945540

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);

image-20221101151701854

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_410442.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于协同过滤推荐算法的在线教育平台(Vue+Node.js+SSM)

基于协同过滤推荐算法的在线教育平台&#xff08;前后端分离&#xff09;。 back为后端&#xff0c;front为前端&#xff0c;config-files为相关配置文件 摘要 随着科技的不断变迁&#xff0c;信息技术的不断迭代升级。人们对于互联网方方面面的需求都开始涌现了出来&#xf…

第9章实验作业

实验9:异常处理及程序调试 一、实验目的和要求 1、了解代码异常知识; 2、掌握异常处理的try…except语句、try…except…else语句、try…except…finally语句。raise语句; 3、掌握程序调试的方法。 二、实验环境 软件版本:Python 3.10 64_bit 三,实验过程 实验1 (1) def…

实战经验:如何根据系统的业务场景需求定制自己的线程池?

线程池有那么多的参数和类型&#xff0c;在实际的开发中&#xff0c;我们应该如何设置呢&#xff1f;是直接使用Executors提供的线程池实现&#xff0c;还是自定义线程池&#xff1f;这都是我们本篇文章要回答的问题&#xff0c;那么就请跟随笔者一起分析一下在实战中如何根据系…

uniapp开发微信小程序-用户授权登录和获取手机号码

小程序开放文档 uniapp开发的小程序配置&#xff0c;找到manifest.json&#xff0c;填入正确的小程序appId&#xff1b; hbuilderx>运行>运行到小程序模拟器(安装开发者工具)&#xff0c;编译完成之后会直接在微信开发者工具内打开&#xff1b; 登录流程解析&#xff1…

【SpringBoot】一文了解SpringBoot热部署

文章目录前言手动启动热部署热部署种类手动进行热部署自动启动热部署热部署范围配置热部署的关闭总结&#x1f315;博客x主页&#xff1a;己不由心王道长&#x1f315;! &#x1f30e;文章说明&#xff1a;一文彻底搞懂SpringBoot热部署&#x1f30e; ✅系列专栏&#xff1a;Sp…

程序人生:去了字节跳动,才知道年薪40W的测试有这么多?

今年大环境不好&#xff0c;内卷的厉害&#xff0c;薪资待遇好的工作机会更是难得。最近脉脉职言区有一条讨论火了&#xff1a; 哪家互联网公司薪资最‘厉害’&#xff1f; 下面的评论多为字节跳动&#xff0c;还炸出了很多年薪40W的测试工程师 我只想问一句&#xff0c;现在的…

【C#】async和await

大概理解 查了一个小时的资料&#xff1a;async和await 发现这个大神的解释一针见血&#xff0c;深得我心&#xff01;以最简单的例子&#xff0c;解释了async和await。妙~~~ 大多情况下&#xff0c;分开才能体现async和await的价值&#xff01; 但&#xff0c;await 并没有…

C#中的弃元

从C#7.0开始,推出了一种新的特性:弃元,这种思想可能来源于Golang。弃元,就是不想要了的元素变量,用单下划线(_)表示,弃元在编译时起作用,就是搞编译器:这个变量我不要,你可以优化处理。我们经常在下面几个过程中使用弃元:1、元组解构赋值在使用元组解构赋值时,我们…

Linux——进程间通信——管道(文件)通信

目录 前言 一、有名管道 1、用法 2、管道分类 3、有名管道的创建 4、思考&#xff1a;如何进程a要将键盘获取的数据传递给另一个进程b&#xff1f; 5、有名管道实现进程间通信 二、无名管道 1、无名管道的创建 2、管道操作分为以下步骤 3、无名管道实现进程间通信 前言…

string类详解

文章目录1:构造string类1.1:方法1.2:测试2:size和length2.1:用途2.2:测试3:capacity3.1:用途3.2:测试4:clear4.1:用途4.2:测试5:empty5.1:用途5.2:测试6:reserve6.1:用途6.2:测试7:resize7.1:用途7.2:测试8:string的三种遍历8.1:方法一 for循环和[]重载8.2:方法二 迭代器8.2.1:…

基于CNTK/C#实现逻辑回归【附源码】

文章目录前言一、VS2022CNTK环境搭建二、逻辑回归代码构建1.逻辑回归构建2.训练数据的生成3.模型训练三、效果展示前言 本文基于CNTK实现逻辑回归二分类&#xff0c;并以之前的不同&#xff0c;本次使用C#实现&#xff0c;不适用python&#xff0c;python版的CNTK比较简单&…

Java多线程-ThreadPool线程池(三)

开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括:1、T1:创建(启动) 2、T2:运行(行驶)…

苹果IOS应用上架AppStore的流程与教程

快打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程第一步:创建app发布证书以及配置文件1、打开苹果开发者中心网站:https://developer.apple.com,点击右上角 Account 使用开发者账号登录,如下图所示:​编辑切换为居中添加图片注释,不超过 140 字(可选)2、…

基于IoT全链路实时质量-魔洛哥

简介: 通过基于IoT的全链路实时质量,业务使用狄仁杰进行全链路埋点后,可一键接入魔洛哥平台,实现终端问题的实时感知和链路分析,以及智能终端系统业务场景的全链路实时质量。整体方案接入成本低(分钟级别接入),可实现全链路的实时质量分析,以及精准的终端预警能力。帮…

JavaScript 51 JavaScript 严格模式

JavaScript 文章目录JavaScript51 JavaScript 严格模式51.1 "use strict" 指令51.2 声明严格模式51.3 "use strict"; 语法51.4 为什么使用严格模式&#xff1f;51.5 严格模式中不允许的事项51.6 对未来的保障51.7 警告51 JavaScript 严格模式 “use stric…

IDEA下载与安装,保姆级教程

这里写自定义目录标题1.搜索idea2.选择官方网站3.官网进入下载页面4.版本选择问题5. Ultimate和Community对比6.下载7.安装1.搜索idea 2.选择官方网站 以前idea的官网后面有官网俩字&#xff0c;现在没有了&#xff0c;你可以看他的具体网址&#xff0c;因为idea是Jetbrains公…

猿创征文|计算机学生必须掌握的学习工具

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.c/c使用的软件 二.GitHub和gitee的使用 三.学会如何去调试代码 修改bug 四.学习Linux上面的基本操作 五.java使用的软件 六.p…

【案例源码公开】国产AD+全志T3开发案例,为能源电力行业排忧解难!8/16通道

前 言 本文主要介绍基于全志科技T3(ARM Cortex-A7)国产处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616国产AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 备注: (1)创龙科技TL7606I模块使用AD芯片为核芯互联CL1606或ADI AD…

Softing连接解决方案——将FANUC数控机床数据集成到西门子工业边缘

2022年10月10日&#xff08;哈尔&#xff09;&#xff0c;Softing发布了edgePlug FANUC CNC&#xff0c;其丰富了edgePlug产品系列。该产品系列基于Linux的Docker容器应用并为西门子工业边缘应用提供了控制器数据。 &#xff08;Softing的edgePlug Docker容器产品为西门子工业边…

《Python+Kivy(App开发)从入门到实践》自学笔记:简单UX部件——Label标签

章节知识点总揽 4.2 Label标签 在Kivy中&#xff0c;Label小部件用于呈现文本&#xff0c;它仅支持ASCII和Unicode编码的字符串&#xff08;不支持中文&#xff09;&#xff0c;在Label中&#xff0c;可以设置文本内容、字体、大小、颜色、对齐方式、换行、引用以及标记文字等…