Фреймворк для преобразования объектов Java

Я работаю над проектом по преобразованию сущностей базы данных в объекты DTO. Для этого для каждого преобразования используется специальный класс конвертера.


Я привожу упрощенный пример того, что мы делаем. Я намеренно пропустил сеттеры / геттеры и некоторые другие вещи для ясности кода.

Итак, вот постоянные сущности:

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;
}

Важным требованием является то, что он не должен использовать любое отражение. Все аннотации или файлы свойств должны быть скомпилированы на этапе компиляции или прекомпиляции, а байт-код или исходный код должны быть сгенерированы.

Я буду очень рад, если кто-нибудь сможет указать мне на такую ​​структуру. Я также с удовольствием буду участвовать в его создании, если он еще находится в разработке.

11
задан Zalivaka 6 November 2010 в 15:51
поделиться