今天在調(diào)試web應(yīng)用的時(shí)候,碰到時(shí)間序列化和反序列化問題,網(wǎng)上查的資料一般都是關(guān)于 @JsonFormat 和 @DateFormat
網(wǎng)上好多說的是 @JsonFormat 是 把 對象轉(zhuǎn) string 即序列化起作用,@DateFormat 是string 轉(zhuǎn) 對象 即反序列化起作用,也有的說 @JsonFormat 序列化和反序列化都有作用。
其實(shí)問題不是這個(gè)簡單,到底誰起作用是有條件的。
1、當(dāng)前端請求 content-Type 為 application/json 時(shí)
請求到后端 string 轉(zhuǎn) 對象 是 @JsonFormat 起作用。
domain文件
controller層
postman發(fā)請求。
從上面可以看出,后端反序列化出錯(cuò)
現(xiàn)在我把注解換下,如下
public class Test { @JsonFormat(pattern = "yyyy-MM-dd")// @DateTimeFormat(pattern = "yyyy-MM-dd") private Date date1; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")// @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date2; public Date getDate1() { return date1; } public void setDate1(Date date1) { this.date1 = date1; } public Date getDate2() { return date2; } public void setDate2(Date date2) { this.date2 = date2; }}
此時(shí)后端能調(diào)通,且返回的結(jié)果時(shí)間格式是正確的,我們可以發(fā)現(xiàn)這種情況下@JsonFormat在反序列化和序列化過程都起作用了。
2、當(dāng)請求類型:content-Type 為 form-data
此時(shí)domain還和上面一樣,請求url換func1,因?yàn)檫@里content-Type 為 form-data
把注解換成如下
public class Test {// @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date date1;// @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date2; public Date getDate1() { return date1; } public void setDate1(Date date1) { this.date1 = date1; } public Date getDate2() { return date2; } public void setDate2(Date date2) { this.date2 = date2; }}
此時(shí)能調(diào)通,string 轉(zhuǎn) 對象 @DateFormat起作用。
把domain改為:
public class Test { @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private Date date1; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date date2; public Date getDate1() { return date1; } public void setDate1(Date date1) { this.date1 = date1; } public Date getDate2() { return date2; } public void setDate2(Date date2) { this.date2 = date2; }}
結(jié)果:
此時(shí) 前端傳后端string 轉(zhuǎn) 對象是@DateFormat 起作用,后端傳前端 對象 轉(zhuǎn)string 是@DateFormat起作用。
總結(jié):
1、@JsonFormat有序列化(對象轉(zhuǎn)string)和反序列化(string轉(zhuǎn)對象)的作用。
2、當(dāng)前端數(shù)據(jù)類型為application/json時(shí)@JsonFormat一個(gè)注解就可以起到序列化和反序列化的左右。
3、當(dāng)前端數(shù)據(jù)類型為multipart/form-data是,前端傳后端 string轉(zhuǎn)date @DateFormat起作用,后端傳前端 @JsonFormat起作用。