Java中@DateTimeFormat和@JsonFormat注解介紹
1.@DateTimeFormat注解
1.1@DateTimeFormat注解簡介
@DateTimeFormat
注解是由Spring提供的一個注解,位于Spring和核心組件之一的context組件。對應(yīng)的所需依賴如下:
# SpringBoot對應(yīng)的依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> # Spring對應(yīng)的依賴 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency>
雙擊shift快捷鍵,全局搜索DateTimeFormat
,查看外部庫,DateTimeFormat
本質(zhì)上是一個接口
@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
注解的功能是將一個日期字符串轉(zhuǎn)化為對應(yīng)的Date類型,主要處理前端時間類型與后端pojo對象中的成員變量進行數(shù)據(jù)綁定,在注解屬性patttern中所約束的時間格式并不會影響后端返回前端的時間類型數(shù)據(jù)格式。。
DateTimeFormat
接口的pattern屬性:
pattern屬性類型為String類型,用于格式化字段或方法參數(shù)的自定義模式。默認(rèn)為空字符串,表示沒有指定自定義模式字符串。
當(dāng)然也可以使用自定義日期模式字符串,如yyyy-MM-dd HH:mm:ss
1.3@DateTimeFormat注解的注意點
@DateTimeFormat
注解既可以作用于pojo類型的屬性上,也可以作用于方法參數(shù)上。- 前端傳入的時間類型的字符串要和pattern屬性所規(guī)定的規(guī)則相同。
@DateTimeFormat
注解只能處理非JSON數(shù)據(jù)格式的字符串(如url-String格式、Form-Data格式),如果要處理JSON數(shù)據(jù)格式,就需要采用@RequestBody
注解,@RequestBody
就是獲取請求體中的內(nèi)容(即JSON字符串),再通過JSON解析庫(如Jackson、FatJosn)將JSON字符串轉(zhuǎn)換為pojo對象。
? 兩種JSON解析庫所需依賴:
<!-- fastjson所需依賴 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.54</version> </dependency>
? Jackson由于是Spring提供的,所以它所需的依賴就在Spring依賴中。
@DateTimeFormat
注解只是解析日期字符串轉(zhuǎn)為Date類型,轉(zhuǎn)換后的日期格式并不會受到@DateTimeFormat
注解中pattern屬性的約束。
1.4@DateTimeFormat功能演示
1.4.1類型轉(zhuǎn)換異常情況測試
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進行接口測試,傳輸?shù)臄?shù)據(jù)格式為url路徑傳參
請求400,查看控制臺日志信息
報錯信息:即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路徑傳參格式測試
pojo層
@Data @NoArgsConstructor @AllArgsConstructor @ToString public class User { private String username; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date birthday; }
用ApiFox進行接口測試,傳輸?shù)臄?shù)據(jù)格式為url路徑傳參
? 查看響應(yīng)情況和控制臺輸出情況:可以發(fā)現(xiàn)@DateTimeFormat
注解對日期字符串進行了解析,轉(zhuǎn)換為對應(yīng)的Date類型
? 但是要注意:@DateTimeFormat
注解只是解析日期字符串轉(zhuǎn)為Date類型,轉(zhuǎn)換后的日期格式并不會受到@DateTimeFormat
注解中pattern屬性的約束。
? 響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:
1.4.3接收Form-Data數(shù)據(jù)格式測試
pojo和controller都不變
用ApiFox進行接口測試,傳輸?shù)臄?shù)據(jù)格式為Form-Data類型
測試結(jié)果:
響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:
1.4.4接收J(rèn)SON數(shù)據(jù)格式測試
? 接受JSON數(shù)據(jù)格式時,在接收參數(shù)時,通過@RequestBody
獲取請求體中的內(nèi)容(即JSON字符串),再通過JSON解析庫(如Jackson、FatJosn)將JSON字符串轉(zhuǎn)換為pojo對象
- 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進行接口測試,傳輸?shù)臄?shù)據(jù)格式為JSON類型
測試結(jié)果:
? 響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:
使用JSON解析庫Jackson進行解析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進行接口測試,傳輸?shù)臄?shù)據(jù)格式為JSON類型
測試結(jié)果
? 控制臺報錯,錯誤信息提示反序列化失敗,因為jackson默認(rèn)的日期反序列不支持yyyy-MM-dd HH:mm:ss
這種格式,而是默認(rèn)"yyyy-MM-dd’T’HH:mm:ss.SSSX"
,所以反序列化失敗。
? 這就引出了今天要介紹的另一個注解@JsonFormat
2.@JsonFormat注解
2.1@JsonFormat注解簡介
? @JsonFormat注解是由Jackson提供的一個注解,位于Jackson的annotation包中,本身也是一個接口
所對應(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注解的功能是處理請求中的JSON日期字符串和查詢數(shù)據(jù)庫中的日期類型。即可約束時間類型的請求格式和響應(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)時間](UTC)/[格林尼治時間](GMT)快8小時的時區(qū),我國就是屬于東八區(qū),所以要指定時區(qū)為"GTM+8"
2.3@JsonFormat注解的注意點
- @JsonFormat只能作用在實體類上,不能作用于方法參數(shù)上。
- @JsonFormat會根據(jù)pattrn屬性約束日期格式,在返回數(shù)據(jù)時會返回約束日期格式,這點和@DateTimeFormat不同
- @JsonFormat注解需要先通過@RequestBody將入?yún)?shù)映射到實體后,@JsonFormat注解才能去對時間格式進行約束;
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; } }
測試結(jié)果:
? 響應(yīng)的JSON字符串?dāng)?shù)據(jù)如下:
? 可以發(fā)現(xiàn)@JsonFormat注解可以根據(jù)pattern屬性對返回的數(shù)據(jù)進行約束
3.總結(jié)
當(dāng)處理的數(shù)據(jù)格式為非JSON格式(url路徑傳參、Form-Data)的時候適合使用@DateTimeFormat
注解進行處理,就是格式化后的日期格式并不會按照屬性pattern中所約束的格式響應(yīng),如果想要規(guī)定日期格式,可采用SimpleDateFormat
對象進行處理。
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ù)格式時適合使用@JsonFormat
注解進行處理,在這之前需要使用@RequestBody
注解獲取請求體中的JSON字符串,再通過JSON解析庫將JSON字符串轉(zhuǎn)換為對應(yīng)的POJO類型?;蛘呤菑臄?shù)據(jù)庫中查出對應(yīng)的DateTime類型時對類型進行轉(zhuǎn)換。
到此這篇關(guān)于Java中@DateTimeFormat和@JsonFormat注解介紹的文章就介紹到這了,更多相關(guān)@DateTimeFormat和@JsonFormat注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Cache和EhCache實現(xiàn)緩存管理方式
這篇文章主要介紹了Spring Cache和EhCache實現(xiàn)緩存管理方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06java書店系統(tǒng)畢業(yè)設(shè)計 用戶模塊(3)
這篇文章主要介紹了java書店系統(tǒng)畢業(yè)設(shè)計,第三步系統(tǒng)總體設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10JetBrains IntelliJ IDEA 優(yōu)化教超詳細(xì)程
這篇文章主要介紹了JetBrains IntelliJ IDEA 優(yōu)化教超詳細(xì)程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03spring cloud gateway網(wǎng)關(guān)路由分配代碼實例解析
這篇文章主要介紹了spring cloud gateway網(wǎng)關(guān)路由分配代碼實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01Spring Boot 啟動加載數(shù)據(jù) CommandLineRunner的使用
本篇文章主要介紹了Spring Boot 啟動加載數(shù)據(jù) CommandLineRunner的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04淺談Ribbon、Feign和OpenFeign的區(qū)別
這篇文章主要介紹了淺談Ribbon、Feign和OpenFeign的區(qū)別。具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06詳解Android系統(tǒng)中的root權(quán)限獲得原理
這篇文章主要介紹了詳解Android系統(tǒng)中的Root權(quán)限獲得原理,安卓基于Linux,所以原理也相當(dāng)于Linux中的root用戶,需要的朋友可以參考下2015-08-08