Java中@DateTimeFormat @JsonFormat失效原因及測試填坑
一、時間傳值
前端時間控件,一般情況下直接會傳一個yyyy-MM-dd的日期字符串到后臺。這個時候如果我們直接用java.util.Date類型就無法正確接收到?;蛘呶覀儚臄?shù)據(jù)庫里查到DateTime類型并且用java的Date類型接收并返回給前臺的時候,前臺也無法用yyyy-MM-dd的形式進(jìn)行呈現(xiàn)。這個時候,前面兩種情況分別對應(yīng)了@DateTimeFormat和@JsonFormat注解的使用。
二、@DateTimeFormat
該注解主要解決前端時間控件傳值到后臺接收準(zhǔn)確的Date類屬性的問題,我們可以在需要接收的類中對應(yīng)的時間類型屬性上加上@DateTimeFormat注解,并在注解中加上pattern屬性,例如:
/** * @author liu * @date 2022年04月14日 16:31 */ @Data public class User { private String createTime; private String orderTime; @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") //@DateFormatValidation(format = "yyyy-MM-dd HH:mm:ss", message = "與要求的日期格式[yyyy-MM-dd HH:mm:ss]不符") private LocalDateTime genTime; }
三、@JsonFormat
同樣,我們在對應(yīng)的接收對象時間類型上加上@JsonFormat注解,并在注解中加上pattern屬性以及timezone屬性
例如
/** * @author liu * @date 2022年04月14日 16:31 */ @Data public class User { private String createTime; private String orderTime; // @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") //@DateFormatValidation(format = "yyyy-MM-dd HH:mm:ss", message = "與要求的日期格式[yyyy-MM-dd HH:mm:ss]不符") private LocalDateTime genTime; }
@DateTimeFormat使用場景
@DateTimeFormat只會在類似@RequestParam的請求參數(shù)(url拼接的參數(shù)才生效)上生效,如果@DateTimeFormat放到@RequestBody下是無效的。
@JsonFormat使用場景
在@RequestBody中則可以使用@JsonFormat把傳給后臺的時間字符串轉(zhuǎn)成Date,也就是說**@JsonFormat其實(shí)既可以把傳給后臺的時間字符串轉(zhuǎn)成Date也可以把后臺傳出的Date轉(zhuǎn)成時間字符串**。
通常情況下@RequestBody用的比較多演示@JsonFormat使用場景
代碼
/** * @author liu * @date 2022年04月14日 16:31 */ @Data public class User { private String createTime; private String orderTime; // @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") //@DateFormatValidation(format = "yyyy-MM-dd HH:mm:ss", message = "與要求的日期格式[yyyy-MM-dd HH:mm:ss]不符") private LocalDateTime genTime; }
傳輸對象
/** * @author liu * @date 2022年04月26日 10:42 */ @Data public class UserSaveDto { private String code; private List<User> list ; }
用apiPost測試時測試字符串
{ “code”: “11”, “l(fā)ist”: [ { “createTime”: “aa”, “orderTime”: “xx”, “genTime”: “2022-04-26 15:17:59” } ] }
看似沒有問題但后臺一直報錯
2022-04-26 15:50:22.423 WARN 39112 — [nio-9090-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type
java.time.LocalDateTime
from String “2022-04-26 15:17:59”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2022-04-26 15:17:59’ could not be parsed at index 11; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of typejava.time.LocalDateTime
from String “2022-04-26 15:17:59”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2022-04-26 15:17:59’ could not be parsed at index 11 at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 68] (through reference chain: com.example.demo.test.UserSaveDto[“list”]->java.util.ArrayList[0]->com.example.demo.test.User[“genTime”])]
時間格式還是不準(zhǔn)確,可能我們考慮是不是注解不好用,錯了,是你的json字符串有問題
必須是json格式化出來的字符串
json工具類
package com.example.demo.test; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.text.SimpleDateFormat; /** * @author liu * @date 2022年04月26日 15:02 */ public class JsonUtils { /** * 功能描述: 重載方法,只傳入一個object就可以,默認(rèn)的日期格式就是"yyyy-MM-dd HH:mm:ss" * @return java.lang.String */ public static String getJson(Object object) { return getJson(object, "yyyy-MM-dd HH:mm:ss"); } //靜態(tài)方法,拿來即用,日期就輸入格式,不是日期就調(diào)用上面的,就日期格式也不影響 public static String getJson(Object object, String dateformat) { ObjectMapper mapper = new ObjectMapper(); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); mapper.registerModule(new JavaTimeModule()); //不使用時間差的方式 WRITE_DATE_KEYS_AS_TIMESTAMPS:將日期鍵作為時間戳寫入 改為false mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false); SimpleDateFormat format = new SimpleDateFormat(dateformat); //指定日期格式 mapper.setDateFormat(format); try { //就是不是日期對象也不影響,都是正常調(diào)用了writeValueAsString方法 return mapper.writeValueAsString(object); } catch (JsonProcessingException e) { e.printStackTrace(); } //如果有異常,就返回null return null; } }
格式化出來的字符串
{ “code”: “11”, “l(fā)ist”: [ { “createTime”: “aa”, “orderTime”: “xx”, “genTime”: “2022-04-26 15:17:59” } ] }
然后再發(fā)請求
響應(yīng)
[User(createTime=aa, orderTime=xx, genTime=2022-04-26T15:17:59)]
到此這篇關(guān)于Java中@DateTimeFormat @JsonFormat失效原因及測試填坑的文章就介紹到這了,更多相關(guān)Java @DateTimeFormat @JsonFormat失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot全局配置long轉(zhuǎn)String丟失精度的問題解決
web項(xiàng)目中,Java后端傳過來的Long/long類型,前端JS接收會丟失精度。那么應(yīng)該如何解決,本文就來介紹一下幾種方法,感興趣的可以了解一下2021-08-08java中的編碼轉(zhuǎn)換過程(以utf8和gbk為例)
這篇文章主要介紹了java中的編碼轉(zhuǎn)換過程(以utf8和gbk為例),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù)
本篇文章主要介紹了spring boot中使用@Async實(shí)現(xiàn)異步調(diào)用任務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-02-02Java實(shí)現(xiàn)游戲飛機(jī)大戰(zhàn)-III的示例代碼
這篇文章主要為大家介紹了如何利用Java實(shí)現(xiàn)經(jīng)典的游戲之飛機(jī)大戰(zhàn),文中采用了swing技術(shù)進(jìn)行了界面化處理,感興趣的小伙伴可以動手試一試2022-02-02JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問題
這篇文章主要介紹了JAVA中堆、棧,靜態(tài)方法和非靜態(tài)方法的速度問題,堆和棧得速度性能分析多角度給大家分析,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08使用springboot開發(fā)的第一個web入門程序的實(shí)現(xiàn)
這篇文章主要介紹了使用springboot開發(fā)的第一個web入門程序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04