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

創(chuàng)新互聯(lián)建站于2013年創(chuàng)立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元合水做網(wǎng)站,已為上家服務(wù),為合水各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
- @EqualsAndHashCode(callSuper = true)
- @Data
- public class SimpleUserResponse extends WeComResponse {
- private List
userlist; - }
- @EqualsAndHashCode(callSuper = true)
- @Data
- public class UserDetailResponse extends WeComResponse {
- private List
userlist; - }
是不是差不多?于是就利用泛型將它們合并了:
- @EqualsAndHashCode(callSuper = true)
- @Data
- public class UserResponse
extends WeComResponse { - private List
userlist; - }
這樣通過(guò)UserResponse 和UserResponse 就能定義他們了,簡(jiǎn)化了不少代碼。不過(guò)沒(méi)多久又來(lái)了一個(gè)類:
- @EqualsAndHashCode(callSuper = true)
- @Data
- public class QrCodeResponse extends WeComResponse {
- private String qrcode;
- }
這個(gè)結(jié)構(gòu)其實(shí)也差不多啊,如果把UserResponse 進(jìn)一步改造成:
- @EqualsAndHashCode(callSuper = true)
- @Data
- public class OjbectResponse
extends WeComResponse { - 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:
- @Mapping(target = "data", source = "qrcode")
- @Mapping(target = "data", source = "userlist")
通過(guò)上面的兩個(gè)注解映射編寫兩個(gè)轉(zhuǎn)換接口就解決了。關(guān)于Mapstruct可以看我相關(guān)的講解文章。
如果是反序列化
Jackson提供了一個(gè)別名注解@JsonAlias,可以讓字段屬性名稱接受更多的別名。就像這樣:
- @EqualsAndHashCode(callSuper = true)
- @Data
- public class OjbectResponse
extends WeComResponse { - @JsonAlias({"qrcode","userlist"})
- private T data;
- }
那么下面這個(gè)json能映射到OjbectResponse 中:
- {
- "qrcode":"https://felord.cn/myqr.png"
- }
這個(gè)會(huì)映射到OjbectResponse
- {
- "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 我們可以:
- ObjectMapper objectMapper = new ObjectMapper();
- String json = "{\"qrcode\":\"https://felord.cn/myqr.png\"}";
- OjbectResponse
obj = objectMapper.readValue(json,new TypeReference >(){});
其實(shí)對(duì)應(yīng)的Spring也提供了類似的工具類org.springframework.core.ParameterizedTypeReference ,特別是如果你使用了RestTemplate來(lái)請(qǐng)求第三方的時(shí)候會(huì)用到這個(gè)泛型處理工具。
網(wǎng)站題目:一些簡(jiǎn)化定義和轉(zhuǎn)換JavaBean的一些小技巧
轉(zhuǎn)載來(lái)源:http://m.5511xx.com/article/ccdcipo.html


咨詢
建站咨詢
