Java中@DateTimeFormat和@JsonFormat注解介紹
1.@DateTimeFormat注解
1.1@DateTimeFormat注解簡(jiǎn)介
@DateTimeFormat注解是由Spring提供的一個(gè)注解,位于Spring和核心組件之一的context組件。對(duì)應(yīng)的所需依賴如下:
# SpringBoot對(duì)應(yīng)的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
# Spring對(duì)應(yīng)的依賴
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
雙擊shift快捷鍵,全局搜索DateTimeFormat,查看外部庫(kù),DateTimeFormat本質(zhì)上是一個(gè)接口

@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注解的功能是將一個(gè)日期字符串轉(zhuǎn)化為對(duì)應(yīng)的Date類型,主要處理前端時(shí)間類型與后端pojo對(duì)象中的成員變量進(jìn)行數(shù)據(jù)綁定,在注解屬性patttern中所約束的時(shí)間格式并不會(huì)影響后端返回前端的時(shí)間類型數(shù)據(jù)格式。。
DateTimeFormat接口的pattern屬性:
pattern屬性類型為String類型,用于格式化字段或方法參數(shù)的自定義模式。默認(rèn)為空字符串,表示沒有指定自定義模式字符串。
當(dāng)然也可以使用自定義日期模式字符串,如yyyy-MM-dd HH:mm:ss
1.3@DateTimeFormat注解的注意點(diǎn)
@DateTimeFormat注解既可以作用于pojo類型的屬性上,也可以作用于方法參數(shù)上。- 前端傳入的時(shí)間類型的字符串要和pattern屬性所規(guī)定的規(guī)則相同。
@DateTimeFormat注解只能處理非JSON數(shù)據(jù)格式的字符串(如url-String格式、Form-Data格式),如果要處理JSON數(shù)據(jù)格式,就需要采用@RequestBody注解,@RequestBody就是獲取請(qǐng)求體中的內(nèi)容(即JSON字符串),再通過JSON解析庫(kù)(如Jackson、FatJosn)將JSON字符串轉(zhuǎn)換為pojo對(duì)象。
? 兩種JSON解析庫(kù)所需依賴:
<!-- fastjson所需依賴 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
</dependency>
? Jackson由于是Spring提供的,所以它所需的依賴就在Spring依賴中。
@DateTimeFormat注解只是解析日期字符串轉(zhuǎn)為Date類型,轉(zhuǎn)換后的日期格式并不會(huì)受到@DateTimeFormat注解中pattern屬性的約束。
1.4@DateTimeFormat功能演示
1.4.1類型轉(zhuǎn)換異常情況測(cè)試
pojo層
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private String username;
private Date birthday;
}
controller層
@Slf4j
@RestController
@RequestMapping("/datetimeFormatTest")
public class DatetimeFormatTest {
@GetMapping("/exception")
public User dft1(User user){
log.info( "用戶信息是:" + user);
return user;
}
}
用ApiFox進(jìn)行接口測(cè)試,傳輸?shù)臄?shù)據(jù)格式為url路徑傳參

請(qǐng)求400,查看控制臺(tái)日志信息

報(bào)錯(cuò)信息:即String類型轉(zhuǎn)換為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路徑傳參格式測(cè)試
pojo層
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User {
private String username;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
}
用ApiFox進(jìn)行接口測(cè)試,傳輸?shù)臄?shù)據(jù)格式為url路徑傳參
? 查看響應(yīng)情況和控制臺(tái)輸出情況:可以發(fā)現(xiàn)@DateTimeFormat注解對(duì)日期字符串進(jìn)行了解析,轉(zhuǎn)換為對(duì)應(yīng)的Date類型
? 但是要注意:@DateTimeFormat注解只是解析日期字符串轉(zhuǎn)為Date類型,轉(zhuǎn)換后的日期格式并不會(huì)受到@DateTimeFormat注解中pattern屬性的約束。

? 響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:

1.4.3接收Form-Data數(shù)據(jù)格式測(cè)試
pojo和controller都不變
用ApiFox進(jìn)行接口測(cè)試,傳輸?shù)臄?shù)據(jù)格式為Form-Data類型

測(cè)試結(jié)果:

響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:

1.4.4接收J(rèn)SON數(shù)據(jù)格式測(cè)試
? 接受JSON數(shù)據(jù)格式時(shí),在接收參數(shù)時(shí),通過@RequestBody獲取請(qǐng)求體中的內(nèi)容(即JSON字符串),再通過JSON解析庫(kù)(如Jackson、FatJosn)將JSON字符串轉(zhuǎn)換為pojo對(duì)象
- pojo層不變
- controller層
? 通過FastJson處理JSON數(shù)據(jù),fastjson默認(rèn)使用的序列化格式就是:
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;
}
}
用ApiFox進(jìn)行接口測(cè)試,傳輸?shù)臄?shù)據(jù)格式為JSON類型

測(cè)試結(jié)果:

? 響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:

使用JSON解析庫(kù)Jackson進(jìn)行解析JSON數(shù)據(jù)
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;
}
用ApiFox進(jìn)行接口測(cè)試,傳輸?shù)臄?shù)據(jù)格式為JSON類型

測(cè)試結(jié)果
? 控制臺(tái)報(bào)錯(cuò),錯(cuò)誤信息提示反序列化失敗,因?yàn)閖ackson默認(rèn)的日期反序列不支持yyyy-MM-dd HH:mm:ss 這種格式,而是默認(rèn)"yyyy-MM-dd’T’HH:mm:ss.SSSX",所以反序列化失敗。

? 這就引出了今天要介紹的另一個(gè)注解@JsonFormat
2.@JsonFormat注解
2.1@JsonFormat注解簡(jiǎn)介
? @JsonFormat注解是由Jackson提供的一個(gè)注解,位于Jackson的annotation包中,本身也是一個(gè)接口

所對(duì)應(yīng)的依賴如下:
<!--Jackson包-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
? SpringBoot的web依賴默認(rèn)內(nèi)置的有Jackson相應(yīng)依賴。

2.2@JsonFormat注解的功能
@JsonFormat注解的功能是處理請(qǐng)求中的JSON日期字符串和查詢數(shù)據(jù)庫(kù)中的日期類型。即可約束時(shí)間類型的請(qǐng)求格式和響應(yīng)格式。
JsonFormat接口的pattern屬性:
pattern屬性類型為String類型,用于格式化字段或方法參數(shù)的自定義模式。默認(rèn)為空字符串,表示沒有指定自定義模式字符串。
當(dāng)然也可以使用自定義日期模式字符串,如yyyy-MM-dd HH:mm:ss
JsonFormat接口的timezone屬性:
東八區(qū)([UTC]/[GMT]+08:00)是比[世界協(xié)調(diào)時(shí)間](UTC)/[格林尼治時(shí)間](GMT)快8小時(shí)的時(shí)區(qū),我國(guó)就是屬于東八區(qū),所以要指定時(shí)區(qū)為"GTM+8"
2.3@JsonFormat注解的注意點(diǎn)
- @JsonFormat只能作用在實(shí)體類上,不能作用于方法參數(shù)上。
- @JsonFormat會(huì)根據(jù)pattrn屬性約束日期格式,在返回?cái)?shù)據(jù)時(shí)會(huì)返回約束日期格式,這點(diǎn)和@DateTimeFormat不同
- @JsonFormat注解需要先通過@RequestBody將入?yún)?shù)映射到實(shí)體后,@JsonFormat注解才能去對(duì)時(shí)間格式進(jìn)行約束;
2.4@JsonFormat功能演示
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;
}
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;
}
}
測(cè)試結(jié)果:

? 響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:
? 可以發(fā)現(xiàn)@JsonFormat注解可以根據(jù)pattern屬性對(duì)返回的數(shù)據(jù)進(jìn)行約束

3.總結(jié)
當(dāng)處理的數(shù)據(jù)格式為非JSON格式(url路徑傳參、Form-Data)的時(shí)候適合使用@DateTimeFormat注解進(jìn)行處理,就是格式化后的日期格式并不會(huì)按照屬性pattern中所約束的格式響應(yīng),如果想要規(guī)定日期格式,可采用SimpleDateFormat對(duì)象進(jìn)行處理。
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = simpleDateFormat.format(user.getBirthday());
System.out.println(date);

當(dāng)處理的數(shù)據(jù)格式為JSON數(shù)據(jù)格式時(shí)適合使用@JsonFormat注解進(jìn)行處理,在這之前需要使用@RequestBody注解獲取請(qǐng)求體中的JSON字符串,再通過JSON解析庫(kù)將JSON字符串轉(zhuǎn)換為對(duì)應(yīng)的POJO類型?;蛘呤菑臄?shù)據(jù)庫(kù)中查出對(duì)應(yīng)的DateTime類型時(shí)對(duì)類型進(jìn)行轉(zhuǎn)換。
到此這篇關(guān)于Java中@DateTimeFormat和@JsonFormat注解介紹的文章就介紹到這了,更多相關(guān)@DateTimeFormat和@JsonFormat注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ)解密顯示功能
這篇文章主要介紹了springboot實(shí)現(xiàn)敏感字段加密存儲(chǔ),解密顯示,通過mybatis,自定義注解+AOP切面,Base64加解密方式實(shí)現(xiàn)功能,本文通過代碼實(shí)現(xiàn)給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
Java并發(fā)LinkedBlockingQueue源碼分析
這篇文章主要為大家介紹了Java并發(fā)LinkedBlockingQueue源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解
這篇文章主要介紹了Java 高并發(fā)的三種實(shí)現(xiàn)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Springboot升級(jí)到2.7.2結(jié)合nacos遇到的坑及解決
這篇文章主要介紹了Springboot升級(jí)到2.7.2結(jié)合nacos遇到的坑及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
Java Scala數(shù)據(jù)類型與變量常量及類和對(duì)象超詳細(xì)講解
本文內(nèi)容主要分為3節(jié),依次講解:Scala的數(shù)據(jù)類型有哪些? 變量常量如何使用? 類和對(duì)象如何理解? 受限于博主的大腦容量,大概是無法做到事無巨細(xì)的,不過其實(shí)也沒必要那么"細(xì)",抓住主要脈絡(luò),加上大量的練習(xí),融會(huì)貫通只不過是時(shí)間的問題2022-12-12
IDEA報(bào)錯(cuò):java?找不到符號(hào)圖文解決過程
這篇文章主要給大家介紹了關(guān)于IDEA報(bào)錯(cuò):java?找不到符號(hào)解決的相關(guān)資料,運(yùn)行項(xiàng)目時(shí)Idea報(bào)錯(cuò),提示找不到符號(hào),但是這個(gè)類在項(xiàng)目里是存在的,網(wǎng)上找了很多文章都沒解決,浪費(fèi)了一個(gè)下午終于弄好了,記錄一下,需要的朋友可以參考下2023-08-08
Swagger-boostrap-ui如何配置用戶名密碼訪問
這篇文章主要介紹了Swagger-boostrap-ui如何配置用戶名密碼訪問,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同
這篇文章主要介紹了深入學(xué)習(xí)java內(nèi)存化和函數(shù)式協(xié)同,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06

