BeanUtils.copyProperties VS PropertyUtils.copyProperties


作為兩個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類型的可能會存在問題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM