2010-11-06 60 views
11

我正在處理將數據庫實體轉換爲DTO對象的項目。要做到這一點,每個轉換使用一個特殊的轉換器類。轉換java對象的框架


我正在提供我們正在做的事情的簡化示例。爲了代碼清晰,我故意錯過了setter/getters和其他一些東西。

因此,這裏是持久的實體:

class Car { 
    String number; 
    Driver driver; 
} 

class Driver { 
    String name; 
    License license; 
} 

class License { 
    String serial; 
    Date expired; 
} 

並假設我們需要下面的DTO對象:

class DriverDTO { 
    String name; 
    String carNumber; 
    String licenseSerial; 
} 

我們創建以下轉換器類:

class DriverDTOConverter { 
    DriverDTO convert(Car car) { 
     DriverDTO driverDto = new DriverDTO(); 
     driverDto.carNumber = car.number; 
     driverDto.name = car.driver.name; 
     driverDto.licenseSerial = car.driver.license.serial; 
     return driverDto; 
    } 
} 

一點點更復雜的例子:

class CarDTO { 
    String number; 
    String driverName; 
    LicenseDTO driverLicense; 
} 

class LicenseDTO { 
    String serial; 
} 

class CarDTOConverter { 
    CarDTO convert(Car car) { 
     CarDTO carDto = new CarDTO(); 
     carDto.number = car.number; 
     carDto.driverName = car.driver.name; 
     LicenseDtoConverter c = new LicenseDtoConverter(); 
     carDto.driverLicense = c.convert(car.driver.license); 
     return carDto; 
    } 
} 

class LicenseDtoConverter { 
    LicenseDTO convert(License license) { 
     LicenseDTO licenseDto = new LicenseDTO(); 
     licenseDto.serial = license.serial; 
     return licenseDto; 
    } 
} 

這需要大量的時間,所以我不知道是否有可以採取該項工作的責任義務任何框架。我只需要使用屬性文件或註釋來配置它。

水木清華這樣的

如果屬性文件提出:

DriverDto <--> Car { 
carNumber = number; 
name = driver.name;    
licenseSerial = driver.license.serial; 
} 

CarDTO <--> Car { 
number = number; 
driverName = driver.name; 
driverLicense = driver.license; 
} 

LicenseDTO <--> License { 
license = license; 
} 

或者例如可能註釋實體

@Converted(Car.class) 
class DriverDTO { 
    @Associated("driver.name") 
    String name; 
    @Associated("number") 
    String carNumber; 
    @Associated("driver.license.serial") 
    String licenseSerial; 
} 

的重要要求之一是,它不應該使用任何反映。應該在編譯或預編譯階段編譯所有註釋或屬性文件,並且應該生成字節碼或源代碼。

如果有人能指出我這樣的框架,我將非常高興。如果它仍處於發展階段,我也將樂意參與其創作。

回答

5

您應該檢查出Dozer - Java bean bean映射器。易於使用,易於擴展。

+0

Thx我已經採取了第一眼看它。如果我們不考慮它使用反射,這是我想要的。無論如何,我將答案標記爲正確。如果有人可以提出更強大的框架,我會很高興,並會改變我的「正確」的答案選擇。 – Zalivaka 2010-11-08 08:35:21

+0

在認識推土機的過程中,我提出了以下鏈接http://stackoverflow.com/questions/1432764/any-tool-for-java-object-to-object-mapping。對於那些也對這個問題感興趣的人可能會有所幫助。 – Zalivaka 2010-11-09 09:57:48

3

您可能會看看ModelMapper

它與Dozer和其他人不同,它通過智能地映射對象模型來最小化所需的配置數量。在需要配置的地方,ModelMapper提供了一個重構安全API,它使用實際代碼來映射屬性和值,而不是使用字符串引用或XML。

退房的ModelMapper網站獲取更多信息:

http://modelmapper.org

0

一種可以替代的推土機,你可能會發現有趣的是jDTO活頁夾,它是非常簡單的使用,並提供與最流行的後端集成容器。

jDTO Binder

0

您可能會感興趣MapStruct這是一個編譯時代碼生成器,正是這種使用情況(免責聲明:我在做這個項目)。

由於MapStruct是一個構建時工具,它不使用反射,也不需要排序運行時依賴。需要聲明的接口是這樣的:

@Mapper 
public interface CarMapper { 

    CarMapper INSTANCE = Mappers.getMapper (CarMapper.class); 

    @Mapping(source="number", target="carNumber") 
    @Mapping(source="driver.name", target="name") 
    @Mapping(source="driver.license.serial", target="licenseSerial") 
    CarDto carToCarDto(Car car); 

    DriverDto driverToDriverDto(Driver driver); 
} 

在構建(例如,通過Maven的或在您的IDE),MapStruct將生成接口,基本上看起來像你原來的手寫代碼的實現。

如果你有興趣,你可以在reference guide找到更多。