自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一些簡(jiǎn)化定義和轉(zhuǎn)換Java Bean的一些小技巧

開(kāi)發(fā) 后端
今天在封裝第三方應(yīng)用的開(kāi)放接口,寫(xiě)了很多返回值的類,這些類很多都是結(jié)構(gòu)相似只是個(gè)別字段名稱不一樣。為了單獨(dú)的字段就要復(fù)制一個(gè)改改不勝其煩,而且起名是最頭疼的事情。

[[406257]]

今天在封裝第三方應(yīng)用的開(kāi)放接口,寫(xiě)了很多返回值的類,這些類很多都是結(jié)構(gòu)相似只是個(gè)別字段名稱不一樣。為了單獨(dú)的字段就要復(fù)制一個(gè)改改不勝其煩,而且起名是最頭疼的事情。就像下面這兩個(gè):

  1. @EqualsAndHashCode(callSuper = true
  2. @Data 
  3. public class SimpleUserResponse extends WeComResponse { 
  4.     private List<SimpleUser> userlist; 
  5.  
  6. @EqualsAndHashCode(callSuper = true
  7. @Data 
  8. public class UserDetailResponse extends WeComResponse { 
  9.     private List<UserDetail> userlist; 

是不是差不多?于是就利用泛型將它們合并了:

  1. @EqualsAndHashCode(callSuper = true
  2. @Data 
  3. public class UserResponse<T> extends WeComResponse { 
  4.     private List<T> userlist; 

這樣通過(guò)UserResponse和UserResponse就能定義他們了,簡(jiǎn)化了不少代碼。不過(guò)沒(méi)多久又來(lái)了一個(gè)類:

  1. @EqualsAndHashCode(callSuper = true
  2. @Data 
  3. public class QrCodeResponse extends WeComResponse { 
  4.     private String qrcode; 

這個(gè)結(jié)構(gòu)其實(shí)也差不多啊,如果把UserResponse進(jìn)一步改造成:

  1. @EqualsAndHashCode(callSuper = true
  2. @Data 
  3. public class OjbectResponse<T> extends WeComResponse { 
  4.     private T userlist; 

似乎OjbectResponse就等同于QrCodeResponse。不過(guò)單純這樣搞是不行的,細(xì)心的同學(xué)會(huì)發(fā)現(xiàn)它們的屬性名稱不一樣,一個(gè)是qrcode;一個(gè)是userlist。如果能起個(gè)別名就好了!我似乎有了一個(gè)解決方案。

如果是類型轉(zhuǎn)換

Bean類型轉(zhuǎn)換的話,用Mapstruct就能解決這個(gè)問(wèn)題,最終我們把屬性名稱定義為data:

  1. @Mapping(target = "data", source = "qrcode"
  2.   @Mapping(target = "data", source = "userlist"

通過(guò)上面的兩個(gè)注解映射編寫(xiě)兩個(gè)轉(zhuǎn)換接口就解決了。關(guān)于Mapstruct可以看我相關(guān)的講解文章。

如果是反序列化

Jackson提供了一個(gè)別名注解@JsonAlias,可以讓字段屬性名稱接受更多的別名。就像這樣:

  1. @EqualsAndHashCode(callSuper = true
  2. @Data 
  3. public class OjbectResponse<T> extends WeComResponse { 
  4.     @JsonAlias({"qrcode","userlist"}) 
  5.     private T data; 

那么下面這個(gè)json能映射到OjbectResponse中:

  1.     "qrcode":"https://felord.cn/myqr.png" 

這個(gè)會(huì)映射到OjbectResponse

  1.  "userlist":[{"username":"felord.cn"},{"username":"felordcn"},{"username":"felord"}] 

到這里可能大家會(huì)有疑問(wèn):Jackson是如何處理泛型問(wèn)題的?

如何獲取泛型的Class類型

通過(guò)直接手段是無(wú)法獲取泛型的Class類型的,不過(guò)我們可以獲取到泛型的抽象定義java.lang.reflect.ParameterizedType,直接使用ParameterizedType會(huì)不太方便。所以在Jackson中可以通過(guò)TypeReference來(lái)處理泛型問(wèn)題。如果我們需要反序列化OjbectResponse我們可以:

  1. ObjectMapper objectMapper = new ObjectMapper(); 
  2. String json = "{\"qrcode\":\"https://felord.cn/myqr.png\"}"
  3. OjbectResponse<String> obj = objectMapper.readValue(json,new TypeReference<OjbectResponse<String>>(){}); 

 

其實(shí)對(duì)應(yīng)的Spring也提供了類似的工具類org.springframework.core.ParameterizedTypeReference,特別是如果你使用了RestTemplate來(lái)請(qǐng)求第三方的時(shí)候會(huì)用到這個(gè)泛型處理工具。

 

責(zé)任編輯:武曉燕 來(lái)源: 碼農(nóng)小胖哥
相關(guān)推薦

2020-11-25 07:43:07

Java

2013-04-09 11:26:55

WindowsPhon

2015-08-27 11:16:14

ios開(kāi)發(fā)技巧

2011-03-31 14:16:54

Cacti技巧

2011-06-01 16:50:21

JAVA

2021-12-25 15:30:03

GNOME桌面應(yīng)用

2017-02-28 10:54:40

Pandas

2012-05-21 10:13:05

XCode調(diào)試技巧

2013-03-29 13:17:53

XCode調(diào)試技巧iOS開(kāi)發(fā)

2016-05-13 17:24:00

java大數(shù)據(jù)

2009-04-29 23:04:44

破解還原卡還原精靈

2011-10-26 20:55:43

ssh 安全

2011-07-12 09:47:53

WebService

2011-05-23 18:06:24

站內(nèi)優(yōu)化SEO

2021-10-12 23:10:58

UnsafeJavaJDK

2022-12-02 14:58:27

JavaScript技巧編程

2010-06-11 09:19:23

jQuery

2009-11-26 10:32:57

PHP代碼優(yōu)化

2020-04-08 10:21:58

bash腳本語(yǔ)言

2020-04-14 09:22:47

bash腳本技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)