一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 一些簡化定義和轉換Java Bean的一些小技巧

一些簡化定義和轉換Java Bean的一些小技巧

2021-06-18 23:36碼農小胖哥 Java教程

本文主要分享一些簡化定義和轉換Java Bean的一些小技巧,有需要的朋友可以參考下

一些簡化定義和轉換Java Bean的一些小技巧

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

  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; 

這樣通過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<T> extends WeComResponse { 
  4.     private T userlist; 

似乎OjbectResponse就等同于QrCodeResponse。不過單純這樣搞是不行的,細心的同學會發現它們的屬性名稱不一樣,一個是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<T> 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<String> obj = objectMapper.readValue(json,new TypeReference<OjbectResponse<String>>(){}); 

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

原文鏈接:https://mp.weixin.qq.com/s/XQT8Qrx9yQdjjKNHGsfePQ

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 2021最新国产成人精品免费 | 国产精品福利一区二区亚瑟 | 全肉一女n男np高h双龙养成 | 午夜一级影院 | 日本搜子同屋的日子2国语 日本爽p大片免费观看 | 青柠影视在线播放观看高清 | 亚洲日本视频在线观看 | 性色AV乱码一区二区三区视频 | 欧美精品一区二区在线观看播放 | 国产精品久久一区 | 亚洲国产在线综合018 | 亚洲成人影院在线观看 | 亚洲视频免费在线观看 | 欧美男男xxx激情做受 | 99re这里只有精品在线观看 | 91色porny| 欧美三级小视频 | 香蕉国产成版人视频在线观看 | 四虎永久免费地址ww417 | 国产免费小视频在线观看 | 成人精品亚洲 | 日韩欧美亚洲每日更新网 | 99视频全部免费 | 国产精品视频色拍拍 | 精品91自产拍在线观看99re | 华人在线京东热 | 精品国产自在天天线2019 | 99热精品在线观看 | 青草视频在线观看视频 | 精品国产免费 | 国产在视频 | 俄罗斯美女尿尿 | 国产成人免费片在线视频观看 | 青青青草国产线观 | 欧美图片另类小说综合 | 香蕉大久久 | 亚色九九九全国免费视频 | 亚洲欧美日本在线观看 | 555www成人网 | 亚洲aⅴ天堂| 久久这里只有精品视频e |