作為兩個bean屬性copy的工具類,他們被廣泛使用,同時也很容易誤用,給人造成困然;比如:昨天發現同事在使用BeanUtils.copyProperties copy有integer類型屬性的bean時,
沒有考慮到會將null轉換為0,而后面的業務依賴於null來判斷,導致業務出錯。下面總結一下主要的注意點:
-
大范圍兩個工具類都是對兩個bean之前存在name相同的屬性進行處理,無論是源bean或者目標bean多出的屬性均不處理。
-
具體到BeanUtils是相同name並且類型之間支持轉換的屬性可以處理,而PropertyUtils不支持類型轉換必須是類型和name一樣才處理。
-
對null的處理:PropertyUtils支持為null的場景;BeanUtils對部分屬性不支持null的情況,具體為下:
1)、date類型不支持:異常 dateorg.apache.commons.beanutils.ConversionException: No value
specified for 'Date'
2)、Ineger、Boolean、Long等不支持: 轉為0;
3)、string:支持,保持null;
- 關於類型轉換的例子:
源bean有屬性: private Long dateVal;
目標bean有屬性:private Date dateVal;
使用 PropertyUtils,會保錯:Caused by: java.lang.IllegalArgumentException: argument type mismatch
使用BeanUtils,則相當於new date(dateVal),網上傳言java.util.Date不支持,就測試來說無論是 sql
util 都是ok
- 對於自定義的對象類型屬性 都是淺copy :
比如都有屬性:private Base base; Base有一個屬性String Test;
new.getBase().setTest("new");
那么old.getBase().getTest()也為new
- 性能:get,set《PropertyUtils《BeanUtils
- BeanUtils的高級功能org.apache.commons.beanutils.Converter接口可以自定義類型之間的轉化。PropertyUtils沒有。
BeanUtils.copyProperties(A,B);
如果B中的Integer類型的數據是null的,那么通過這個方法復制給A后,這個null的Integer數據會變成0。
也就是它有自己的規則,如果發現Integer類型的數據如果是null的,它會自作多情的給個默認值!
這個自作多情是很讓開發人員反感的!比如Integer類型的數據=null是一個邏輯業務,但是經過復制后之前的業務邏輯就不執行了!!!
解決方法:使用PropertyUtils.copyProperties(A,B),注:數據類型里面有data類型的可能會存在問題
