精品欧美一区二区三区在线观看 _久久久久国色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)

精品精品导航| 老妇女50岁三级| 老色鬼在线视频| 日本一区二区三区免费乱视频| 91精品国产综合久久香蕉最新版| 久久中文免费视频| 欧美久久精品| 欧美日韩一区三区| 亚洲欧美激情插| 久久人人爽人人爽人人片亚洲| 久久久精品人妻一区二区三区| 成入视频在线观看| 中文字幕在线一区| 精品亚洲欧美日韩| 91免费视频播放| 国产视频一区免费看| 精品久久久999| 免费观看av网站| 亚洲乱码一区| 91麻豆精品国产自产在线 | 色在线免费视频| 国产在线播精品第三| 青草青草久热精品视频在线网站 | 婷婷久久综合九色综合绿巨人| 日韩欧美精品一区二区| 国产91免费在线观看| 精品一区二区三区久久久| 欧美一区二区视频97| 精品无码黑人又粗又大又长| 99热在线成人| 亚洲图片制服诱惑| 亚洲香蕉中文网| 免费无码av片在线观看| 最近中文字幕在线观看| 日韩午夜一区| 欧美理论片在线观看| 一级片久久久久| 色综合综合网| 日韩电影在线观看中文字幕 | 欧美成aaa人片在线观看蜜臀| 国产人妻大战黑人20p| 久久夜色精品国产噜噜av小说| 欧美情侣在线播放| 中文字幕一区二区三区四区在线视频| 免费看男女www网站入口在线 | 国产黄色免费视频| 国产免费成人| 性视频1819p久久| 成年人午夜视频| 在线不卡视频| 97国产在线视频| 国产成人无码精品久久久久| 好看的日韩av电影| 久久久久国产视频| 日本熟妇毛耸耸xxxxxx| 伊人成人在线| 91国在线精品国内播放| 日韩精品视频播放| 国产精品亚洲产品| 国产成人精品在线| 狠狠躁夜夜躁人人爽视频| 久热re这里精品视频在线6| 欧美性受xxxx黑人猛交| 亚洲欧美偷拍一区| 日韩精品欧美精品| 国产美女主播一区| 国产精品自产拍| 国产精品一级片| 国产高清精品一区| 日本天堂影院在线视频| 国产日韩欧美不卡在线| 一区二区三区视频| 污片视频在线免费观看| 午夜精品福利视频网站| 日韩中文字幕二区| www.久久爱.com| 日韩欧美一二三区| 黄色录像a级片| 国产成人三级| 久久伊人精品一区二区三区| 久久99久久久| 免费精品视频| 国产在线视频不卡| www夜片内射视频日韩精品成人| 懂色av中文字幕一区二区三区| 国产欧美日韩视频一区二区三区| 美丽的姑娘在线观看免费动漫| 国产免费观看久久| 一二三四中文字幕| 久久青青视频| 欧美日韩国产综合草草| 中文字幕人妻无码系列第三区| 国产三级精品三级在线观看国产| 国产亚洲欧洲高清| 欧美三级免费看| 久久精品伊人| 91久久国产婷婷一区二区| 少妇av一区二区| 国产精品久久三区| 国产 日韩 亚洲 欧美| 日本精品另类| 亚洲国产另类久久精品| 日本不卡一区视频| 一区二区精品| 91美女片黄在线观| 噜噜噜在线观看播放视频| 亚洲精品国产无天堂网2021| 日本黄网站免费| 欧一区二区三区| 伊人久久免费视频| 国产黄色片视频| 久久99精品国产.久久久久久| 精品91免费| 在线不卡日本v二区707| 91成人在线免费观看| 亚洲成年人在线观看| 国产精品久久久久久久久久10秀 | 中文字幕亚洲国产| 日本网站在线播放| 国产aⅴ综合色| 中文字幕中文字幕在线中一区高清| 高清精品在线| 日韩精品一区二区三区在线播放| 亚洲精品资源在线| 久久发布国产伦子伦精品| 国产精品一区二区av交换| 久久久久久成人精品| 一级做a爱片久久毛片| 国产亚洲精品7777| 亚洲色成人一区二区三区小说| aiss精品大尺度系列| 久久亚洲欧美日韩精品专区| 中文字幕免费观看视频| 久久只精品国产| 国产美女网站在线观看| 中文字幕区一区二区三| 欧美大尺度激情区在线播放| 国产一区二区小视频| 国产精品视频yy9299一区| 成人性生生活性生交12| 久久91麻豆精品一区| 欧美亚洲成人免费| 色视频在线观看免费| 精品国产1区2区| 波多野结衣视频播放| 影音先锋中文字幕一区二区| 97se视频在线观看| 中文字幕伦理免费在线视频 | av资源站久久亚洲| 综合久久2o19| 精品乱人伦小说| 动漫精品一区一码二码三码四码| 国产91在线|亚洲| 妞干网视频在线观看| 97一区二区国产好的精华液| 久久久久久亚洲精品不卡| 成人小说亚洲一区二区三区| 一区二区在线看| 亚洲香蕉中文网| 午夜在线一区| 亚洲高清视频一区二区| 久久亚洲人体| 久久成人精品电影| 日韩美女激情视频| 欧美日韩 一区二区三区| 国产丝袜在线精品| 国产原创精品在线| 亚洲深深色噜噜狠狠爱网站| 国产传媒一区二区| 午夜久久中文| 这里只有精品丝袜| 国产免费一区二区三区最新不卡 | 亚洲永久精品视频| 亚洲人123区| 中国特级黄色大片| 久久久蜜桃一区二区人| 亚洲bbw性色大片| 国产欧美视频在线| 97精品一区二区视频在线观看| 日韩午夜影院| 51久久夜色精品国产麻豆| 国产亚洲自拍av| 国产清纯美女被跳蛋高潮一区二区久久w | 国产真实乱人偷精品视频| 久久久精品一品道一区| 91看片破解版| 亚洲欧美日韩国产| 影音先锋在线亚洲| 久久草在线视频| 国产精品永久在线| 182在线视频观看| 最近2019年好看中文字幕视频| aaa一区二区三区| 欧美性xxxxx极品娇小| 三上悠亚在线观看视频| 波多野结衣在线一区| 久久99爱视频| 国产欧美午夜| 亚洲成人动漫在线| 国产欧美日韩精品一区二区免费| 亚洲一区二区三区成人在线视频精品| 久久青草伊人| 欧美乱大交xxxxx| 1024免费在线视频| 免费在线日韩av| 欧美日韩福利在线观看| 国产精品秘入口| 亚洲国产中文字幕在线观看| 中文字幕一区二区三区四区视频| 午夜伊人狠狠久久| 国产探花在线视频| 日本一区二区三区久久久久久久久不 | 欧美精品一区二区蜜臀亚洲| 在线观看国产精品入口男同| 欧美天天综合色影久久精品| 欧美人禽zoz0强交| 国产欧美日韩在线视频| 中文字幕在线播放视频| 国产精品资源在线| 中文字幕av专区| 老司机午夜精品视频在线观看| 欧美一区二区激情| 中文在线日韩| 久久av秘一区二区三区| 国内亚洲精品| 精品国产乱码久久久久久丨区2区| 亚洲成人黄色| 成人写真福利网| 久久久国产精品网站| 清纯唯美日韩制服另类| 亚洲啊v在线| 91国内揄拍国内精品对白| 爱情岛亚洲播放路线| 欧美高跟鞋交xxxxhd| 国精产品一区| 久久精品国产欧美亚洲人人爽| 国产小视频在线| 亚洲欧美日韩中文在线| 性感美女视频一二三| 亚洲国模精品一区| 国产区二精品视| 暧暧视频在线免费观看| 欧美激情视频一区| 性欧美猛交videos| 欧美黑人xxx| xxxx在线视频| 91成品人片a无限观看| 国产美女高潮在线| 久久人人爽人人爽人人片av高请 | 欧美影院一区| 亚洲啊啊啊啊啊| 国内一区二区三区| 国产曰肥老太婆无遮挡| 亚洲九九精品| 国产精品丝袜久久久久久消防器材| 中文精品视频| 日韩 欧美 高清| 蜜臀久久99精品久久久久久9| 91极品视频在线观看| 久久精品国产99国产| 激情久久综合网| 成人在线一区二区三区| 中文字幕在线免费看线人| 久久蜜桃av一区二区天堂| www.黄色在线| 亚洲欧洲三级电影| 夫妻性生活毛片| 一区二区三区产品免费精品久久75| 国产一级特黄视频| 天天av天天翘天天综合网 | 青娱乐国产91| 久久五月天小说| 中文精品无码中文字幕无码专区| 日韩视频一区| 国产精品乱码久久久久| 91黑人精品一区二区三区| 国产精品乱人伦中文| 印度午夜性春猛xxx交| 五月天网站亚洲| 成人免费视频国产免费| 91精品在线免费观看| 蜜臀av免费在线观看| 亚洲视频自拍偷拍| 99视频免费在线观看| 97人人模人人爽人人喊中文字| 91av一区| 国产日韩欧美一区二区| 精品久久电影| 国产乱子伦精品无码专区| 日韩黄色免费网站| 18深夜在线观看免费视频| ww亚洲ww在线观看国产| 少妇久久久久久被弄高潮| 色综合久久久久综合体| 精品黑人一区二区三区国语馆| 日韩精品福利在线| 中文字幕中文字幕在线十八区 | www.五月婷婷.com| 欧美成人精精品一区二区频| 韩国三级在线观看久| 欧美人成在线视频| 日本久久二区| 久久伦理网站| 欧美精品一区二区三区久久久竹菊| 日本三区在线观看| 成人h动漫精品| 国产jizz18女人高潮| 欧美日韩国产麻豆| jlzzjlzzjlzz亚洲人| 国产一区二区三区欧美| 波多野结衣在线播放| 亚洲v日韩v综合v精品v| 欧美理论电影大全| 欧美在线一区视频| 国产精品一区2区| 亚洲一二三四五六区| 疯狂蹂躏欧美一区二区精品| 99国产精品久久久久99打野战| 亚洲午夜色婷婷在线| 麻豆mv在线观看| 18成人在线| 91视频一区| 天天爱天天操天天干| 久久伊人蜜桃av一区二区| 日本少妇毛茸茸高潮| 精品国一区二区三区| av网站在线看| 91九色视频导航| 天天射天天综合网| 日韩一级免费片| 国产精品色哟哟| 伊人成年综合网| 亚洲女人天堂av| 原纱央莉成人av片| 精品无码久久久久久久动漫| 亚洲欧洲一级| 成年女人免费视频| 亚洲国产欧美日韩另类综合| 精品人妻伦一区二区三区久久| 久久天天躁狠狠躁夜夜躁| 欧美成人xxxx| 亚洲电影网站| 美腿丝袜亚洲色图| 蜜桃av免费观看| 欧美日韩成人综合天天影院| 香蕉视频在线看| 亚洲aⅴ男人的天堂在线观看 | 精品久久久久久久久久中文字幕| 成人久久视频在线观看| 男人的天堂一区二区| 亚洲精品国偷自产在线99热| 手机在线观看av网站| 噜噜噜噜噜久久久久久91| 亚欧成人精品| 免费网站在线高清观看| 欧美在线一二三| 日本中文在线观看| 91久久精品国产91久久性色tv| 国产精品v日韩精品v欧美精品网站 | 三级视频中文字幕| 亚洲婷婷综合久久一本伊一区| 国产欧美日韩综合精品一区二区三区| 欧美成人午夜免费视在线看片| 亚洲综合网站| jizzjizz国产精品喷水| 国产亚洲欧美日韩俺去了| 日批视频免费观看| 久久精品亚洲94久久精品| 日韩中文字幕一区二区高清99| 成人免费在线网| 国产亚洲综合在线| 国产麻豆91视频| 久久久久一本一区二区青青蜜月| 亚洲精品亚洲人成在线观看| 最新中文字幕2018| 亚洲中国最大av网站| 头脑特工队2在线播放| 国产精品久久久久久久美男| 永久亚洲成a人片777777| 免费a v网站| 欧美另类变人与禽xxxxx| 日韩激情av| 欧洲精品在线一区| 国产又粗又猛又爽又黄91精品| 久久久国产欧美| 欧美日韩激情| 亚洲国产午夜精品| 欧美日韩亚洲精品一区二区三区| 成人午夜电影在线观看| 91九色视频在线观看| 三级成人在线视频| 强乱中文字幕av一区乱码| 国产网站欧美日韩免费精品在线观看| 四虎影视成人精品国库在线观看| 国产亚洲黄色片| 国产精品美女视频| 天天操天天操天天干| 成人黄色av播放免费| 国产精品久久久亚洲一区| 国产色无码精品视频国产|