我正在處理將數據庫實體轉換爲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;
}
的重要要求之一是,它不應該使用任何反映。應該在編譯或預編譯階段編譯所有註釋或屬性文件,並且應該生成字節碼或源代碼。
如果有人能指出我這樣的框架,我將非常高興。如果它仍處於發展階段,我也將樂意參與其創作。
Thx我已經採取了第一眼看它。如果我們不考慮它使用反射,這是我想要的。無論如何,我將答案標記爲正確。如果有人可以提出更強大的框架,我會很高興,並會改變我的「正確」的答案選擇。 – Zalivaka 2010-11-08 08:35:21
在認識推土機的過程中,我提出了以下鏈接http://stackoverflow.com/questions/1432764/any-tool-for-java-object-to-object-mapping。對於那些也對這個問題感興趣的人可能會有所幫助。 – Zalivaka 2010-11-09 09:57:48