Я работаю над проектом по преобразованию сущностей базы данных в объекты 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;
}
Важным требованием является то, что он не должен использовать любое отражение. Все аннотации или файлы свойств должны быть скомпилированы на этапе компиляции или прекомпиляции, а байт-код или исходный код должны быть сгенерированы.
Я буду очень рад, если кто-нибудь сможет указать мне на такую структуру. Я также с удовольствием буду участвовать в его создании, если он еще находится в разработке.