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。
推薦閱讀:
- 關於BeanUtils.copyProperties(source, target)的使用
- 詳解Spring中BeanUtils工具類的使用
- java 如何復制非空對象屬性值
- 聊聊BeanUtils.copyProperties和clone()方法的區別
- 基於Spring BeanUtils的copyProperties方法使用及註意事項