BeanCopier屬性複製值全為null

2021-10-19 15:20:47 字數 2770 閱讀 2815

在解決乙個引數校驗過程中,發現beancopier複製的所有值全為null。beancopier使用**如下

public

static

t copy

(t src)

}catch

(exception e)

return target;

}

經檢查發現,原來是對實體新加了@accessors(chain = true)註解導致的。

去掉該註解後,複製值全為null的問題就解決了。

單單解決問題是不夠的,還要弄清背後的原理。

1.@accessors

首先分析@accessors的作用(官方文件:

@accessors主要用於配置getter和setter方法的生成結果,有三個屬性,如下圖所示

fluent設定為true的話,則getter和setter方法的方法名都是基礎屬性名,且setter方法返回當前物件。

@data

@accessors

(fluent =

true

)public

class

user

public user id

(long id)

public string name()

public user name

(string name)

}

1.2.chainchain設定為true,則setter方法返回當前物件

@data

@accessors(chain = true)

public class user

public user setname(string name) {}

}

1.3.prefixperfix,用於生成getter和setter方法的欄位名會忽視指定字首(遵守駝峰命名)

@data

@accessors(prefix = "p")

class user

public void setid(long id) {}

public string getname() {}

public void setname(string name) {}

}

2.beancopier

在文章最開始的那段**中,核心**就兩行

copier = beancopier.create // 生成用於兩個bean間進行複製的類

copier.copy(source, target, converter) // 執行複製

所有值都為null,但是物件複製卻複製成功,初步懷疑是不是set的時候失敗了。

研究了下beancopier原始碼,發現有個generateclass方法,其中有個獲取實體類setter的方法。

下圖是實體類沒有和有@accessors註解的兩種setters情況

可以發現加上@accessors註解後,setter就沒有獲取到實體的set方法(剩餘的4個是父類的set方法)

進入getbeansetters方法

public static propertydescriptor getbeansetters(class type) 

private static propertydescriptor getpropertieshelper(class type, boolean read, boolean write)

list properties = new arraylist(all.length);

for (int i = 0; i < all.length; i++)

}return (propertydescriptor)properties.toarray(new propertydescriptor[properties.size()]);

} catch (introspectionexception e)

}

其中getpropertydescriptors在@accessors註解的情況下如下,可以發現屬性都沒有writemethod(除了父類的屬性)

綜上分析大致可知:@accessors(chain = true)會將setter方法的返回值由void修改為 當前物件。 這導致setter的方法簽名改變,最終導致beancopier無法識別現有的setter方法。

BeanCopier物件複製學習

size large color red beancopier是cglib包中的乙個類,用於物件的複製。color size size medium color blue 注意 目標物件必須先例項化 而且物件必須要有setter方法 color size 初始化例子 beancopier copie...

OC 屬性 深複製 淺複製

main.m import import human.h int main int argc,const char argv return 0 human.h import inte ce human nsobject property null resettable nonatomic,copy ...

BeanUtils bean的屬性複製

commons beanutils之複製bean屬性 問題你有兩個相同型別的bean的例項,並需要將其中乙個bean的屬性複製到另乙個中去.解決方案 使用propertyutils.copyproperties 方法從乙個bean複製屬性到另乙個bean.其中第乙個引數 指定目的bean,而第二個引...