分析多層架構(gòu)的JEE系統(tǒng),經(jīng)常存在JavaBean直接的拷貝。比如在DAO層,我們通過(guò)POJO取得業(yè)務(wù)層需要的數(shù)據(jù),將這些數(shù)據(jù)傳遞給Service層的VO。POJO與VO就存在典型的值拷貝。還有就是Webservice,客戶端調(diào)用Webservice,也存在將大量返回值映射到相應(yīng)的JavaBean里。呵呵 我們項(xiàng)目就是這個(gè)需求。
典型的解決方案就是手動(dòng)拷貝,弊端很明顯,代碼中充斥大量Set Get方法,真正的業(yè)務(wù)沒(méi)埋藏與值的拷貝之中。另一種方案就是使用BeanUtil,但BeanUtil不夠很好的靈活性,又時(shí)候還不得不手動(dòng)拷貝。
對(duì)于這種重復(fù)沒(méi)有實(shí)際意義的拷貝難道沒(méi)有終結(jié)解決方案嗎?! Dozer 一把JavaBean利器。(http://dozer.sourceforge.net/)
什么是Dozer?
看看官方的定義:
Dozer is a Java Bean to Java Bean mapper that recursively copies data from one object to
another. Typically, these Java Beans will be of different complex types.
Dozer supports simple property mapping, complextype mapping, bi-directional mapping, implicitexplicit mapping, as well as recursive
mapping.This includes mapping collection attributes that also need mapping at the element level.
注意:Dozer支持簡(jiǎn)單類(lèi)型 復(fù)雜類(lèi)型的雙向遞歸映射。
如何使用呢? 類(lèi)似BeanUtil 很簡(jiǎn)單,如果兩個(gè)javaBean之間,屬性名相同,類(lèi)型為基本類(lèi)型,那么下面代碼就OK了,基本沒(méi)有學(xué)習(xí)曲線。
Mapper mapper = new DozerBeanMapper();
DestinationObject destObject = mapper.map(sourceObject, DestinationObject.class);
or
DestinationObject destObject = new DestinationObject();
mapper.map(sourceObject, destObject);
在后續(xù)的的內(nèi)容中,我會(huì)介紹如何配置復(fù)雜的Map,如何自定義Map,如何獲得Map的統(tǒng)計(jì)數(shù)據(jù)等。JavaBean之間拷貝利器-Dozer(2) 映射數(shù)據(jù)類(lèi)型不一致,級(jí)聯(lián)映射與自定義映射