精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一個(gè)Getter引發(fā)的血案

開(kāi)發(fā) 前端
許多bug都是在自以為沒(méi)有問(wèn)題的地方產(chǎn)生,看似簡(jiǎn)單,更需要小心,同時(shí)也需要多注意序列化原理,整體感覺(jué)序列化還是用Gson更省心,完全不用關(guān)心Getter和Setter方法,會(huì)完全按照屬性名來(lái)序列化。

[[413398]]

本文轉(zhuǎn)載自微信公眾號(hào)「你呀不牛」,作者不牛。轉(zhuǎn)載本文請(qǐng)聯(lián)系你呀不牛公眾號(hào)。

1需求

最近做一了個(gè)需求,調(diào)用其他服務(wù)的REST接口,感覺(jué)很簡(jiǎn)單,于是迅速就搞起來(lái)了

構(gòu)造Request類(lèi)

  1. public class User { 
  2.     private String name
  3.     private Integer age; 
  4.  
  5.     public User(String nameInteger age) { 
  6.         this.name = name
  7.         this.age = age; 
  8.     } 

啪,我上來(lái)就一new

  1. service.sendRequest(new User("niu", 18)); 

打完,收工,又是努力工作(摸魚(yú))的一天。

2定位

但是,某天晚上8點(diǎn),測(cè)試人員突然給我打電話,說(shuō)調(diào)用失敗,同時(shí)本身又缺少打印,沒(méi)有辦法具體哪出問(wèn)題了。

我是不會(huì)認(rèn)為這么簡(jiǎn)單的代碼自己會(huì)出錯(cuò)的,不可能!!

經(jīng)過(guò)網(wǎng)絡(luò)抓包后發(fā)現(xiàn),收到的參數(shù)都是null,但是我這邊明明調(diào)用構(gòu)造器傳入?yún)?shù)了

難道出現(xiàn)靈異事件了?

經(jīng)過(guò)分析,整體數(shù)據(jù)流為:

能出現(xiàn)問(wèn)題的地方只能是序列化JSON地方,于是本地測(cè)試驗(yàn)證了這一結(jié)論:

  1. public static void main(String[] args) throws IOException { 
  2.     ObjectMapper objectMapper = new ObjectMapper(); 
  3.     String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  4.     System.out.println(request); 

雖然是出問(wèn)題了,但是序列化并沒(méi)有轉(zhuǎn)為屬性為null的對(duì)象,而是直接拋出異常

  1. Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class online.jvm.bean.User and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) 
  2.  at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) 

通過(guò)查詢(xún)異常資料,解決掉這種異常需要在增加Jackson的序列化配置FAIL_ON_EMPTY_BEANS,F(xiàn)AIL_ON_EMPTY_BEANS這個(gè)配置表示如果某個(gè)bean序列化為空時(shí)不會(huì)異常失敗

  1. public static void main(String[] args) throws IOException { 
  2.     ObjectMapper objectMapper = new ObjectMapper(); 
  3.     objectMapper.configure(FAIL_ON_EMPTY_BEANS, false); 
  4.     String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  5.     System.out.println(request); 

這種就不會(huì)報(bào)錯(cuò),而是返回序列化成空串,也就導(dǎo)致接受方為屬性都為null

通過(guò)看自研RPC框架看到是有該FAIL_ON_EMPTY_BEANS的配置

3解決

再來(lái)分析一下原因,Jackson序列化時(shí)需要調(diào)用bean的getter方法

1、寫(xiě)上getter后再看下結(jié)果:

  1. public class User { 
  2.     private String name
  3.     private Integer age; 
  4.  
  5.     public User(String nameInteger age) { 
  6.         this.name = name
  7.         this.age = age; 
  8.     } 
  9.  
  10.     public String getName() { 
  11.         return name
  12.     } 
  13.  
  14.     public Integer getAge() { 
  15.         return age; 
  16.     } 
  17.  
  18.     public static void main(String[] args) throws IOException { 
  19.         ObjectMapper objectMapper = new ObjectMapper(); 
  20.         String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  21.         System.out.println(request); 
  22.         // 輸出正常 : {"name":"niu","age":18} 
  23.     } 

2、或者把屬性訪問(wèn)權(quán)限改為public

  1. public class User { 
  2.     public String name
  3.     public Integer age; 
  4.  
  5.     public User(String nameInteger age) { 
  6.         this.name = name
  7.         this.age = age; 
  8.     } 
  9.  
  10.     public static void main(String[] args) throws IOException { 
  11.         ObjectMapper objectMapper = new ObjectMapper(); 
  12.         String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  13.         System.out.println(request); 
  14.         // 輸出正常 : {"name":"niu","age":18} 
  15.     } 

但是如果要求不能暴露bean的屬性即使是getter也不行呢?

3、注解 @JsonProperty

這是就需要使用Jackson提供的注解 @JsonProperty

  1. public class User { 
  2.     @JsonProperty("userName"
  3.     private String name
  4.     @JsonProperty 
  5.     private Integer age; 
  6.  
  7.     public User(String nameInteger age) { 
  8.         this.name = name
  9.         this.age = age; 
  10.     } 
  11.  
  12.     public static void main(String[] args) throws IOException { 
  13.         ObjectMapper objectMapper = new ObjectMapper(); 
  14.         String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  15.         System.out.println(request); 
  16.         //   {"userName":"niu","age":18} 
  17.     } 

來(lái)看下注解@JsonProperty的源碼注釋

  1. Marker annotation that can be used to define a non-static method as a "setter" or "getter" for a logical property (depending on its signature), or non-static object field to be used (serialized, deserialized) as a logical property. 

大體意思是注解如果用在屬性上相當(dāng)于為該屬性定義getter和setter。

那如果既有g(shù)etter又有@JsonProperty注解,以哪個(gè)為準(zhǔn)呢?

  1. public class User { 
  2.     @JsonProperty("userName"
  3.     private String name
  4.     @JsonProperty 
  5.     private Integer age; 
  6.  
  7.     public User(String nameInteger age) { 
  8.         this.name = name
  9.         this.age = age; 
  10.     } 
  11.  
  12.     public String getName() { 
  13.         return name
  14.     } 
  15.  
  16.     public static void main(String[] args) throws IOException { 
  17.         ObjectMapper objectMapper = new ObjectMapper(); 
  18.         String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  19.         System.out.println(request); 
  20.         // {"age":18,"userName":"niu"
  21.     } 

如果getter一個(gè)沒(méi)有的屬性,效果如何呢?

  1. public class User { 
  2.     @JsonProperty("userName"
  3.     private String name
  4.     @JsonProperty 
  5.     private Integer age; 
  6.  
  7.     public User(String nameInteger age) { 
  8.         this.name = name
  9.         this.age = age; 
  10.     } 
  11.  
  12.     public String getName2() { 
  13.         return name
  14.     } 
  15.  
  16.     public static void main(String[] args) throws IOException { 
  17.         ObjectMapper objectMapper = new ObjectMapper(); 
  18.         String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  19.         System.out.println(request); 
  20.         // {"age":18,"name2":"niu","userName":"niu"
  21.     } 

這說(shuō)明如果有@JsonProperty注解,先以注解為準(zhǔn)

然后利用反射找到對(duì)象類(lèi)的所有g(shù)et方法,接下來(lái)去get,然后小寫(xiě)化,作為json的每個(gè)key值,而get方法的返回值作為value。接下來(lái)再反射field,添加到j(luò)son中。

4、特殊情況

還有一種比較特殊的情況, getter方法由lombok生成,且屬性的次首字母是大寫(xiě):

  1. @Getter 
  2. public class User { 
  3.     @JsonProperty 
  4.     private String nAme
  5.     @JsonProperty 
  6.     private Integer age; 
  7.  
  8.     public User(String nameInteger age) { 
  9.         this.nAme = name
  10.         this.age = age; 
  11.     } 
  12.  
  13.     public static void main(String[] args) throws IOException { 
  14.         ObjectMapper objectMapper = new ObjectMapper(); 
  15.         String request = objectMapper.writeValueAsString(new User("niu", 18)); 
  16.         System.out.println(request); 
  17.         // {"nAme":"niu","age":18,"name":"niu"
  18.     } 

這是因?yàn)閘ombok生成的getter會(huì)把屬性的第一個(gè)字母變成大寫(xiě),

序列化時(shí)會(huì)把get后與小寫(xiě)字母中間的大寫(xiě)變成小寫(xiě),也就是會(huì)把NA變成小寫(xiě)

所以序列化結(jié)果會(huì)有name(getter獲取)和nAme(注解獲取)兩個(gè)屬性

  1. public String getNAme() { 
  2.     return this.nAme

如果我們自己用idea快捷鍵生成getter,

此時(shí)之后序列化nAme

  1. public String getnAme() { 
  2.     return nAme

4小結(jié)

許多bug都是在自以為沒(méi)有問(wèn)題的地方產(chǎn)生,看似簡(jiǎn)單,更需要小心,同時(shí)也需要多注意序列化原理,整體感覺(jué)序列化還是用Gson更省心,完全不用關(guān)心Getter和Setter方法,會(huì)完全按照屬性名來(lái)序列化。

 

本文的涉及的bug過(guò)程和解決方式希望對(duì)你也有所幫助,再見(jiàn)。

 

責(zé)任編輯:武曉燕 來(lái)源: 你呀不牛
相關(guān)推薦

2021-12-01 06:59:27

架構(gòu)

2018-11-22 15:50:27

MySQL數(shù)據(jù)庫(kù)雙引號(hào)

2021-01-25 08:08:22

APP機(jī)器人KOB

2017-05-22 08:35:07

MySQL雙引號(hào)錯(cuò)位

2021-02-01 10:42:47

MySQL雙引號(hào)數(shù)據(jù)庫(kù)

2017-08-25 16:38:05

表達(dá)式正則血案

2010-08-09 09:46:40

2017-03-20 19:40:29

AndroidSwipeRefres下拉刷新

2021-01-11 05:30:04

Boot 單機(jī)片

2012-02-13 09:42:41

備份服務(wù)器數(shù)據(jù)中心

2011-02-28 09:31:30

HashtableHashMap

2015-02-04 14:36:07

格式串漏洞Ghost漏洞安全漏洞

2011-11-25 13:04:43

空格usr

2019-09-09 08:30:57

MYSQL代碼數(shù)據(jù)庫(kù)

2023-01-11 08:41:47

微服務(wù)循環(huán)依賴(lài)

2020-01-06 09:43:14

賠償TSB遷移

2013-12-05 10:50:13

2017-06-12 16:13:13

曼聯(lián)皇馬傳真機(jī)

2016-12-01 09:30:03

運(yùn)維網(wǎng)絡(luò)網(wǎng)線

2010-11-04 09:11:34

Fedora 14評(píng)測(cè)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

xxx欧美精品| 欧美一二三四区在线| 欧美二区在线看| 一级黄在线观看| 国内自拍一区| 亚洲欧美另类在线观看| 亚洲精品成人在线播放| 成年网站在线视频网站| 中文av字幕一区| 国产区二精品视| 久久久久久av无码免费看大片| 亚洲欧美一区在线| 夜夜嗨av一区二区三区免费区| 免费观看黄网站| 亚洲第一影院| 亚洲自拍偷拍综合| 一区二区三区免费看| 婷婷丁香花五月天| 国产一区二区三区久久悠悠色av| 2024亚洲男人天堂| 欧美成人一二三区| 欧美一区二区三| 日韩av在线免费看| 亚洲欧美日韩网站| av日韩亚洲| 亚洲国产精品一区二区尤物区| 亚洲精品乱码久久久久久蜜桃91| 蜜臀久久精品久久久久| 久久精品久久综合| 国产精品免费一区二区三区都可以| 国产性生活网站| 亚洲乱码免费伦视频| 亚洲天堂一区二区三区| 成人午夜精品无码区| 国产一区2区在线观看| 欧美在线播放高清精品| 中文字幕日本最新乱码视频| 波多野结衣久久| 亚洲精品国产一区二区精华液 | 91福利入口| 一级黄色大毛片| 老色鬼久久亚洲一区二区| 91精品国产91| 亚洲一区欧美在线| 一区在线免费观看| 欧美精品九九久久| 久久网中文字幕| 黄色国产精品| 午夜精品福利视频| 日韩 欧美 综合| 亚洲全部视频| 欧美国产视频日韩| 国产一国产二国产三| 欧美日韩国产探花| 欧美韩国理论所午夜片917电影| 一区二区国产精品精华液| 性欧美欧美巨大69| 欧美成人精品在线| 久久久久性色av无码一区二区| 中文字幕日韩欧美精品高清在线| 久久久精品网站| 一区二区成人免费视频| 欧美影院一区| 欧美极品少妇与黑人| 国产极品在线播放| 午夜一区在线| 国产精品视频久| 999精品国产| 成人黄色777网| 久久大片网站| av网页在线| 亚洲色图欧美激情| 国产欧美精品aaaaaa片| 黄色软件视频在线观看| 日本道精品一区二区三区| 亚洲免费一级视频| 国产亚洲字幕| 日韩精品丝袜在线| 超碰97av在线| 综合久久精品| 97热在线精品视频在线观看| 一级黄色av片| 国产乱码一区二区三区| 国产在线资源一区| 电影在线高清| 尤物视频一区二区| 欧美 丝袜 自拍 制服 另类| 日本h片久久| 日韩片之四级片| 久久无码人妻精品一区二区三区| 精品国产中文字幕第一页| 久久婷婷国产麻豆91天堂| 国产午夜福利一区二区| 青青青伊人色综合久久| 成人欧美视频在线| 国产免费a∨片在线观看不卡| 亚洲男同1069视频| aa在线免费观看| 欧美不卡在线观看| 日韩精品中文字幕在线观看| 永久免费未视频| 国产精品美女久久久| 国产日韩欧美在线观看| 天天爽夜夜爽夜夜爽| 亚洲少妇30p| 国产福利一区视频| 成人av综合网| 久久精品国产亚洲精品2020| 久久久久久在线观看| 国产福利不卡视频| 日韩影院一区| 一二三四视频在线中文| 日韩一级二级三级精品视频| 夫妇交换中文字幕| 日韩亚洲国产欧美| 999视频在线免费观看| 国产网站在线播放| 欧美性极品xxxx做受| 粉色视频免费看| 精品一区av| 秋霞av国产精品一区| 亚洲AV午夜精品| √…a在线天堂一区| 欧洲av无码放荡人妇网站| 96sao在线精品免费视频| 久久精视频免费在线久久完整在线看| 无码人妻久久一区二区三区不卡| av一区二区三区在线| 欧美日韩午夜爽爽| 国产精品一站二站| 久久精品久久久久久国产 免费| 中文字幕在线日本| www国产精品av| 91传媒久久久| 一道在线中文一区二区三区| 性欧美长视频免费观看不卡| 亚洲精品久久久久久动漫器材一区 | 黄色日韩精品| 国产传媒一区二区| 天堂av最新在线| 日韩欧美国产综合在线一区二区三区| 午夜国产小视频| 奇米精品一区二区三区四区| 色噜噜狠狠色综合网| 桃色一区二区| 亚洲最大中文字幕| 天堂av免费在线观看| 久久久午夜电影| 激情婷婷综合网| 国产一区二区三区探花| 国产成人在线精品| 91xxx在线观看| 88在线观看91蜜桃国自产| 日韩免费av一区| 国产乱码精品一区二区三区av | 激情综合亚洲精品| 黄色网址在线免费看| 99热这里有精品| 欧美成人在线免费视频| www.五月婷| 亚洲福利视频一区| 国产传媒第一页| 日日摸夜夜添夜夜添精品视频| 日本一区网站| 视频欧美精品| 久久99精品久久久久久噜噜| 亚洲成人黄色片| 精品国产乱码久久久久酒店 | 四虎在线视频免费观看| 色综合亚洲欧洲| 99久久99久久精品免费| 国产一区二区在线观看视频| 亚洲av综合色区| 欧美巨大xxxx| 国产精品日韩精品| 久久香蕉一区| 亚洲色图17p| 国产精品视频久久久久久| 一区二区三区四区不卡在线 | 亚洲一区二区三区四区在线| 国产精品无码一区二区三区免费| 久久亚洲美女| 天堂av在线中文| 亚洲精品3区| 成人天堂噜噜噜| 成人在线黄色电影| 亚洲网址你懂得| 成人h动漫精品一区二区无码| 五月综合激情婷婷六月色窝| 欧美精品日韩在线| 成人免费黄色在线| 日本a√在线观看| 欧美日韩网站| 亚洲成色www久久网站| 亚洲精选av| 国产精品成av人在线视午夜片 | 日本电影一区二区| 2022国产精品| 日韩三区免费| 久久免费视频网站| 日本视频在线观看| 日韩国产中文字幕| 精品人妻午夜一区二区三区四区| 色综合视频在线观看| 国产女人被狂躁到高潮小说| 国产片一区二区| 久久久老熟女一区二区三区91| 蜜桃精品视频在线| 国产特级黄色大片| 亚洲破处大片| 视频一区二区三区免费观看| 果冻天美麻豆一区二区国产| 91精品在线观看视频| 成人免费短视频| 国产69精品久久久久9| 精品孕妇一区二区三区| 国产午夜精品免费一区二区三区| 人妻少妇精品无码专区| 91精品国产色综合久久不卡电影| 潘金莲一级淫片aaaaaa播放| 亚洲第一激情av| 校园春色 亚洲| 亚洲视频在线观看一区| 永久免费毛片在线观看| 久久久精品日韩欧美| 中文字幕 日本| 国产高清久久久久| 三日本三级少妇三级99| 久久成人久久鬼色| 91日韩视频在线观看| 久久久久综合| av动漫免费看| 老司机一区二区三区| 国产一区二区网| 99日韩精品| 欧美日韩成人免费视频| 一区二区三区四区五区精品视频 | 黄色a级片在线观看| 久久亚洲一区二区三区四区| 给我看免费高清在线观看| 99久久伊人精品| 亚洲蜜桃精久久久久久久久久久久| 丁香五精品蜜臀久久久久99网站 | 亚洲人成网站影音先锋播放| 福利视频第一页| 1024亚洲合集| 丰满少妇被猛烈进入一区二区| **欧美大码日韩| 亚洲天堂黄色片| 一区二区在线观看免费| 中文字幕av久久爽av| 亚洲一区二区在线免费看| 久久精品人妻一区二区三区| 午夜免费久久看| 综合激情网五月| 在线观看视频一区二区欧美日韩| 无码任你躁久久久久久久| 欧日韩精品视频| 国产影视一区二区| 日韩一区二区三区在线视频| 欧美 日韩 人妻 高清 中文| 亚洲国产精品久久91精品| 三级视频在线| 中文字幕日韩欧美| 国产精品实拍| 韩日欧美一区二区| 三级成人黄色影院| 国产拍精品一二三| 亚洲午夜精品| 久久大片网站| 国产精品毛片久久| 国产中文字幕乱人伦在线观看| 国产日本精品| 午夜剧场在线免费观看| 国产成人精品在线看| 久久国产精品影院| 国产精品毛片无遮挡高清| 一区二区三区四区五区| 亚洲第一综合色| 中文区中文字幕免费看| 日韩欧美国产综合一区 | 久久久久久久国产| 欧美日韩美女| 91成人在线看| 国产成人精品999在线观看| 综合久久国产| 国产亚洲欧洲| av在线免费看片| 91美女片黄在线观看91美女| 2014亚洲天堂| 欧美性jizz18性欧美| 在线观看免费中文字幕| 亚洲成人精品视频在线观看| 成人在线视频成人| 欧美国产一区二区三区| 日韩经典一区| 精品乱色一区二区中文字幕| 欧美好骚综合网| 欧美网站免费观看| 国产成人欧美日韩在线电影| 人妻精品久久久久中文| 亚洲午夜久久久久久久久电影网 | 麻豆91精品91久久久的内涵| 秘密基地免费观看完整版中文| 日本一区二区三区四区| 日韩成人一区二区三区| 欧美一区二区在线观看| 国产在线电影| 97国产在线视频| 亚洲男男av| 日韩在线三区| 久久精品五月| 黄色网址在线视频| 亚洲美女淫视频| 在线观看视频二区| 亚洲色图激情小说| 捆绑调教日本一区二区三区| yellow视频在线观看一区二区| 欧美激情理论| 青青青在线视频免费观看| 99热精品一区二区| 久久综合久久鬼| 日韩一区和二区| 成人免费网址| 国产日韩欧美影视| 欧美日韩水蜜桃| 久热免费在线观看| 99re视频这里只有精品| 国产真人真事毛片| 日韩欧美国产一区二区三区| 91麻豆国产福利在线观看宅福利| 国产精品视频久久| 日韩欧美二区| 亚洲欧美国产日韩综合| 中文字幕久久午夜不卡| 亚洲免费视频二区| 在线亚洲国产精品网| 向日葵视频成人app网址| 欧美日韩综合网| 久久只有精品| 中文天堂资源在线| 欧美日韩国产小视频| 91sp网站在线观看入口| 国产精品久久久久久久av电影| 欧美中文字幕一区二区| av免费网站观看| 中文字幕不卡在线播放| 中文字幕免费在线看| 久久精品国产欧美亚洲人人爽| 色婷婷成人网| 男同互操gay射视频在线看| 国产麻豆精品久久一二三| 成年人av电影| 日韩成人av网址| 先锋欧美三级| 亚洲欧美精品在线观看| 激情综合色丁香一区二区| 天天天天天天天天操| 日韩欧美国产1| 麻豆视频在线观看免费网站黄| 久久爱av电影| 老司机精品视频导航| 99热精品免费| 亚洲国产欧美一区二区三区同亚洲 | 丰满大乳国产精品| 97视频免费在线观看| 欧美理论电影大全| www.色就是色.com| 亚洲国产欧美一区二区三区丁香婷| 神马久久久久久久久久| 国产成人午夜视频网址| 天天综合国产| 中文字幕一区三区久久女搜查官| 一本大道久久精品懂色aⅴ| 青青青青在线| 国产精品一区在线观看| 天堂久久久久va久久久久| 日本 欧美 国产| 亚洲国产欧美一区二区丝袜黑人| 欧美三区四区| 蜜桃视频一区二区在线观看| 久久香蕉国产线看观看99| 91极品身材尤物theporn| 欧美激情视频在线| 波多野结衣的一区二区三区| 人妻激情偷乱视频一区二区三区| 欧美日韩免费在线| 国产在线观看91| 精品亚洲欧美日韩| 韩国理伦片一区二区三区在线播放| 久一视频在线观看| 俺也去精品视频在线观看| 欧美福利在线播放网址导航| 欧美美女一级片| 欧美午夜www高清视频| 伊人春色在线观看| 日本精品二区| av电影一区二区| 国产农村妇女毛片精品| 国产成人在线一区|