成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[406257]]

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

  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。不過單純這樣搞是不行的,細心的同學會發(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<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來請求第三方的時候會用到這個泛型處理工具。

 

責任編輯:武曉燕 來源: 碼農小胖哥
相關推薦

2020-11-25 07:43:07

Java

2013-04-09 11:26:55

WindowsPhon

2015-08-27 11:16:14

ios開發(fā)技巧

2011-03-31 14:16:54

Cacti技巧

2011-06-01 16:50:21

JAVA

2021-12-25 15:30:03

GNOME桌面應用

2017-02-28 10:54:40

Pandas

2013-03-29 13:17:53

XCode調試技巧iOS開發(fā)

2012-05-21 10:13:05

XCode調試技巧

2016-05-13 17:24:00

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

2009-04-29 23:04:44

破解還原卡還原精靈

2011-07-12 09:47:53

WebService

2011-10-26 20:55:43

ssh 安全

2022-12-02 14:58:27

JavaScript技巧編程

2011-05-23 18:06:24

站內優(yōu)化SEO

2021-10-12 23:10:58

UnsafeJavaJDK

2010-06-11 09:19:23

jQuery

2020-04-08 10:21:58

bash腳本語言

2020-04-14 09:22:47

bash腳本技巧

2009-11-26 10:32:57

PHP代碼優(yōu)化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美视频免费在线观看 | 久久九精品 | 中文字幕一区二区三区四区五区 | 高清一区二区 | 天天色天天色 | 午夜在线视频 | 欧美日本在线观看 | 久久精品视频亚洲 | 欧美精| 成人一区二区三区视频 | 国产精品久久久久久吹潮 | 亚洲一区二区视频在线观看 | 中文字幕乱码一区二区三区 | 一级片av| 欧美综合视频在线 | 久久国产日韩 | 中文字幕精| 日韩视频精品 | 国产精品日韩一区 | 国产一区二区在线免费视频 | 秋霞在线一区 | 蜜桃av鲁一鲁一鲁一鲁 | 欧美成人一区二免费视频软件 | 激情欧美日韩一区二区 | a网站在线观看 | 在线视频一区二区三区 | 一区二区在线不卡 | 中文字幕1区2区 | 天堂中文在线观看 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产一区二区观看 | 成人免费一区二区三区视频网站 | 欧洲亚洲一区二区三区 | 五月香婷婷 | 91偷拍精品一区二区三区 | 在线国产一区二区 | 99热99 | www.国产 | 午夜影院在线观看 | 日韩免费av| 黄片毛片在线观看 |