2010-11-06 4 views
11

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


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

Так вот постоянные объекты:

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

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

Smth как то

Если сделанные файла свойств:

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

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

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

ответ

5

Вы должны зарегистрироваться Dozer - Java bean to bean mapper. Прост в использовании, легко расширяется.

+0

Thx Я впервые посмотрел на него. Это то, что я хотел, если мы не будем принимать во внимание, что оно использует отражение. В любом случае, я считаю ответ правильным. Если кто-то может предложить более мощную структуру, я буду рад и изменю свой «правильный» ответ. – Zalivaka

+0

Во время знакомства с Дозером я предложил следующую ссылку http://stackoverflow.com/questions/1432764/any-tool-for-java-object-to-object-mapping. Это может быть полезно для кого-то, кто также интересуется этим вопросом. – Zalivaka

3

Вы можете проверить ModelMapper.

Он отличается от Dozer и других тем, что он минимизирует объем конфигурации, необходимый для интеллектуального сопоставления объектных моделей. В тех случаях, когда необходима конфигурация, ModelMapper предлагает безопасный API для рефакторинга, который использует фактический код для сопоставления свойств и значений, а не с использованием ссылок на строки или XML.

проверить сайт ModelMapper для получения дополнительной информации:

http://modelmapper.org

0

Одной из альтернатив для бульдозеров, которые вы можете найти интересное jDTO Binder, она очень проста в использовании и обеспечивает интеграцию с наиболее популярными бэкэндом контейнеры.

jDTO Binder

0

Вы могли бы быть заинтересованы в MapStruct, который является генератором времени компиляции коды именно для этого случая использования (отказ от ответственности: Я работаю над этим проектом).

Поскольку MapStruct - это инструмент времени построения, он не использует отражение и не требует определенных зависимостей времени выполнения. Вы должны объявить интерфейс, как это:

@Mapper 
public interface CarMapper { 

    CarMapper INSTANCE = Mappers.getMapper (CarMapper.class); 

    @Mapping(source="number", target="carNumber") 
    @Mapping(source="driver.name", target="name") 
    @Mapping(source="driver.license.serial", target="licenseSerial") 
    CarDto carToCarDto(Car car); 

    DriverDto driverToDriverDto(Driver driver); 
} 

Во время сборки (например, с помощью Maven или в вашем IDE), MapStruct будет генерировать реализацию этого интерфейса, который в основном выглядит как ваш оригинальный рукописной код.

Если вам интересно, вы можете узнать больше в reference guide.

Смежные вопросы