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

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

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

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

 

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

2013-04-09 11:26:55

WindowsPhon

2020-11-25 07:43:07

Java

2015-08-27 11:16:14

ios開發技巧

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開發

2012-05-21 10:13:05

XCode調試技巧

2016-05-13 17:24:00

java大數據

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

站內優化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代碼優化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 夜夜骚 | 欧美精品日韩精品 | 亚洲国产中文在线 | 中文字幕在线第一页 | 日韩蜜桃视频 | 亚洲一区二区三区免费视频 | 精品成人一区 | 精品色 | 欧美乱淫视频 | 国产一区二区三区 | 久久久久亚洲av毛片大全 | 亚洲精品一区二区三区蜜桃久 | 久久国内| 一区在线观看视频 | 综合久久久 | 国产在线观 | 欧美日韩一区在线 | 中文区中文字幕免费看 | 日韩欧美在线视频 | 久久天天| 中文字幕一区在线观看视频 | 四虎在线观看 | 国产91久久久久 | 亚洲 中文 欧美 日韩 在线观看 | 久久这里有精品 | 欧美综合在线视频 | 国产日韩欧美一区 | 男人的天堂中文字幕 | 色橹橹欧美在线观看视频高清 | 日韩精品 电影一区 亚洲 | 日韩久久久久 | 黄色片在线观看网址 | 久久久久久高清 | 日韩欧美国产精品一区 | 国产美女久久 | 2022国产精品 | 久久久www成人免费精品张筱雨 | 中文字幕综合 | 国产电影一区二区 | www.国产 | 九九综合 |