日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
一些簡化定義和轉換JavaBean的一些小技巧

今天在封裝第三方應用的開放接口,寫了很多返回值的類,這些類很多都是結構相似只是個別字段名稱不一樣。為了單獨的字段就要復制一個改改不勝其煩,而且起名是最頭疼的事情。就像下面這兩個:

創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術服務公司,擁有項目成都網(wǎng)站設計、網(wǎng)站建設網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元合水做網(wǎng)站,已為上家服務,為合水各地企業(yè)和個人服務,聯(lián)系電話:028-86922220

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

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

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

這樣通過UserResponse 和UserResponse 就能定義他們了,簡化了不少代碼。不過沒多久又來了一個類:

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

這個結構其實也差不多啊,如果把UserResponse 進一步改造成:

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

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

如果是類型轉換

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

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

通過上面的兩個注解映射編寫兩個轉換接口就解決了。關于Mapstruct可以看我相關的講解文章。

如果是反序列化

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

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

那么下面這個json能映射到OjbectResponse 中:

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

這個會映射到OjbectResponse

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

到這里可能大家會有疑問:Jackson是如何處理泛型問題的?

如何獲取泛型的Class類型

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

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

 

其實對應的Spring也提供了類似的工具類org.springframework.core.ParameterizedTypeReference ,特別是如果你使用了RestTemplate來請求第三方的時候會用到這個泛型處理工具。


文章名稱:一些簡化定義和轉換JavaBean的一些小技巧
文章網(wǎng)址:http://m.5511xx.com/article/ccdcipo.html