Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Framework for converting java objects

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.

like image 528
Zalivaka Avatar asked Nov 06 '10 15:11

Zalivaka


1 Answers

You should check out Dozer - Java bean to bean mapper. Easy to use, easy to extend.

like image 191
Bivas Avatar answered Sep 25 '22 15:09

Bivas