I am working on project that converts database entities into DTO objects. To do it a special converter class is used for each convertion.
I am providing simplified example of the things we are doing. I intentionally missed setters/getters and some other things for code clarity.
So here are persistent entities:
class Car {
String number;
Driver driver;
}
class Driver {
String name;
License license;
}
class License {
String serial;
Date expired;
}
And assuming that we need following DTO object:
class DriverDTO {
String name;
String carNumber;
String licenseSerial;
}
We create following converter class:
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;
}
}
And a little bit more complex example:
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;
}
}
It takes a lot of time, so I wonder if there is any framework which can take the responsbility for that work. And I will only need to configure it with property files or annotations.
Smth like that
If made by property file:
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;
}
Or example of possible annotated entity
@Converted(Car.class)
class DriverDTO {
@Associated("driver.name")
String name;
@Associated("number")
String carNumber;
@Associated("driver.license.serial")
String licenseSerial;
}
The important requirement is that it should not use any reflection. All annotations or property files should be compiled on compile or precompile stage and bytecode or source code should be generated.
I will be very glad if anybody can point me to such a framework. I will also with pleasure participate in its creation if it is still on developent.
You should check out Dozer - Java bean to bean mapper. Easy to use, easy to extend.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With