BeanUtils.copyProperties()拷貝id屬性失敗的原因及解決

BeanUtils.copyProperties()拷貝id屬性失敗

po類中id有值,但是使用BeanUtils.copyProperties()拷貝出的vo類id屬性為null,檢查後發現是因為po繼承的父類聲明瞭一個泛型。

部分代碼如下

public abstract class AbstractEntity<ID extends Serializable> implements Serializable { 
    protected ID id;
    /**創建人*/
    protected ID createdBy;
    /**創建時間*/
    protected Date createdTime;
 
    /**最後一次修改人*/
    protected ID lastModifiedBy;
    /**最後一次修改時間*/
    protected Date lastModifiedTime; 
    public void setId(ID id) {
        this.id = id;
    }
 
    public ID getId() {
        return this.id;
    }

查看BeanUtils.copyProperties()源碼中有一段判斷如下:

if (readMethod != null && ClassUtils.isAssignable(writeMethod.getParameterTypes()[0], readMethod.getReturnType())) 

當執行到獲取vo類的writeMethod即setId()參數類型,結果是Long類型,而po類的readMethod即getId()返回值類型獲取到的結果卻是Serializable所以BeanUtils認為屬性類型不同,所以不會拷貝id屬性。

解決方法

暫不清楚po類extends AbstractEntity<Long>後為什麼讀取到的類型不是Long而是父類型Serializable,暫時先不用泛型,把id類型直接定義為Long,問題解決~

BeanUtils.copyProperties 出錯

註意:屬性復制,不同jar中的方法,用法不一樣!

Spring 包(org.springframework.beans)中

BeanUtils.copyProperties(A,B);

是A中的值賦值給B

Apache 包(org.apache.commons.beanutils)中(常用)

BeanUtils.copyProperties(A,B);

是B中的值賦值給A

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: