歡迎你們關注 github.com/hsfxuebao/j… ,但願對你們有所幫助,要是以爲能夠的話麻煩給點一下Star哈html
轉自:www.cnblogs.com/Zzwena/p/13…前端
一般定義Java實體類時,對於boolean屬性,阿里規約中明確要求不能使用is開頭。java
至於爲何,咱們稍後再講。git
這裏先講一下前幾天在工做中,項目遇到的一個問題。庫表中某個字段存入了一個實體類的json字符串,在查詢庫表後,須要將json字符串轉爲實體類對象進行更改後再轉爲json字符串後返回給前端。github
在這當中就出現了一個問題,庫表中存入的數據明明是isUpdate的字段,但是在返回到前端後的代碼就是update。
這個問題,起初並無想到是字段定義的問題,經過一步一步的debug,最後才發現是實體類中isUpdate字段的問題,在經過json解析後就轉成了update返回給了前端。json
首先,咱們先定義一個Java實體類,包含一個is開頭的屬性,如isSuccess,再使用idea自動生成的get/set,看看是什麼樣子。markdown
public class IsEntity1 {
private boolean isSuccess;
public boolean isSuccess() {
return isSuccess;
}
public void setSuccess(boolean success) {
isSuccess = success;
}
}
複製代碼
而後再定義一個Java實體類,不是用is開頭的屬性,如success,再使用idea自動生成的get/set,看看是什麼樣子。框架
public class IsEntity2 {
private boolean success;
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
}
複製代碼
此時,會發現不管你是用is開頭或者不用is開頭定義屬性,使用idea自動生成的get/set都是一個樣子的,並且在setSuccess的時候,會將is省略掉。這裏就是項目中遇到的問題所在。ide
由於當類進行序列化時,有些框架的序列化會根據JavaBean的屬性進行序列化,而部分框架是根據JavaBean的getter方法進行序列化,這就會致使在反序列化時與實體類的屬性對應不上。函數
好比說將IsEntity1轉換爲json字符串時,會根據實體類中的get方法進行序列化取isSuccess的值,而使用idea自動生成的get方法直接就是public boolean isSuccess()方法,在取值的時候會認定success是字段名,就會取成success,與原來定義的字段不一樣。
答案是本身寫get方法,不用idea自動生成的get方法。
以下:
public boolean getIsSuccess() {
return isSuccess;
}
複製代碼
這樣,再將實體類轉爲json字符串時,就會認定isSuccess是字段名。
還有一種方法,就是使用JSONField註解
@JSONField(name = "isSuccess")
private boolean isSuccess;
複製代碼
雖然這些方法均可以解決json解析過程丟失is的問題,可是爲了不出現這種問題,咱們最好仍是遵照規約,不使用is開頭定義字段。
分析:
申明屬性,而後用idea自帶的Generator生成getter,setter(封裝類型和基本數據類型生成的還不同),以下:
當我去構造一個PropertyDescriptor時,會報錯
後來跟代碼,發現,報錯緣由是PropertyDescriptor的構造函數去找一個叫setIsSuccess的寫值函數時,發現找不到,因而報錯了。
從上圖能夠看到,實際在構造PropertyDescriptor時,它會嘗試去尋找一個叫isIsSuccess的讀函數,一個叫setIsSuccess的寫函數。當isIsSuccess沒找到時,它會嘗試去找叫getIsSuccess的讀函數,若是仍是沒找到,則拋出異常。當setIsSuccess沒找到時,也會拋出異常。
試了一下發現,用idea自動生成getter,setter只有在使用is打頭的boolean時有這個問題(封裝類型和基本數據類型都有問題),其餘數據類型沒有這個問題。
這方面的問題有時還涉及到json轉換,因此在處理布爾類型數據時,又用is打頭來命名時,不要使用idea自動生成getter和setter。另外,行業裏好像比較合理的作法是禁止Bean裏用is打頭申明boolean類型的變量。