2010-11-06 4 views
11

Ich arbeite an einem Projekt, das Datenbankobjekte in DTO-Objekte konvertiert. Dazu wird für jede Konvertierung eine spezielle Konverterklasse verwendet.Framework zum Konvertieren von Java-Objekten


Ich bin ein vereinfachtes Beispiel für die Dinge, die wir tun. Ich habe absichtlich Setter/Getter und einige andere Dinge für Code Klarheit verpasst.

sind also hier persistenten Entitäten:

class Car { 
    String number; 
    Driver driver; 
} 

class Driver { 
    String name; 
    License license; 
} 

class License { 
    String serial; 
    Date expired; 
} 

Und davon aus, dass wir benötigen folgende DTO-Objekt:

class DriverDTO { 
    String name; 
    String carNumber; 
    String licenseSerial; 
} 

Wir folgenden Konverter-Klasse erstellen:

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

Und ein bisschen komplexer Beispiel:

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

es viel Zeit in Anspruch nimmt, so dass ich frage mich, ob jeder Rahmen ist, die die responsbility für diese Arbeit übernehmen kann. Und ich muss es nur mit Property-Dateien oder Annotationen konfigurieren.

Smth wie die

gemacht Wenn durch Eigenschaftsdatei:

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

Oder Beispiel für mögliche kommentierten Einheit

@Converted(Car.class) 
class DriverDTO { 
    @Associated("driver.name") 
    String name; 
    @Associated("number") 
    String carNumber; 
    @Associated("driver.license.serial") 
    String licenseSerial; 
} 

Die wichtige Voraussetzung ist, dass es keine Reflexion verwendet werden soll. Alle Annotationen oder Property-Dateien sollten kompiliert oder vorkompiliert werden, Stufe und Bytecode oder Quellcode sollte generiert werden.

Ich werde mich sehr freuen, wenn mich jemand auf solch ein Framework hinweisen kann. Ich werde auch gerne an seiner Gründung teilnehmen, wenn es noch in Entwicklung ist.

Antwort

5

Sie sollten Dozer - Java Bean zu Bean Mapper überprüfen. Einfach zu bedienen, einfach zu erweitern.

+0

Thx Ich habe einen ersten Blick darauf genommen. Es ist das, was ich wollte, wenn wir nicht berücksichtigen, dass es Reflexion verwendet. Jedenfalls markiere ich die Antwort als richtig. Wenn jemand einen leistungsfähigeren Rahmen vorschlägt, werde ich froh sein und meine "richtige" Antwortwahl ändern. – Zalivaka

+0

Beim Kennenlernen von Dozer wurde ich mit folgendem Link vorgeschlagen: http://stackoverflow.com/questions/1432764/any-tool-for-java-object-to-object-mapping. Es kann hilfreich sein für jemanden, der sich auch für diese Frage interessiert. – Zalivaka

3

Sie können ModelMapper überprüfen.

Es unterscheidet sich von Dozer und anderen dadurch, dass es den Konfigurationsaufwand minimiert, der für die intelligente Zuordnung von Objektmodellen erforderlich ist. Wenn eine Konfiguration erforderlich ist, bietet ModelMapper eine Refactoring-sichere API, die tatsächlichen Code verwendet, um Eigenschaften und Werte zuzuordnen, anstatt Zeichenfolgenverweise oder XML zu verwenden.

prüfen für weitere Informationen die ModelMapper site:

http://modelmapper.org

0

Eine Alternative zu Dozer, dass Sie interessant zu finden ist jDTO Binder, es ist wirklich einfach zu bedienen und bietet die Integration mit dem beliebtesten Backend Behälter.

jDTO Binder

0

Sie könnten in MapStruct interessiert sein, die genau für diesen Anwendungsfall einen Compiler-Code-Generator ist (Disclaimer: Ich bin an diesem Projekt arbeiten).

Da MapStruct ein Build-Time-Tool ist, verwendet es weder Reflektion noch benötigt es Laufzeitabhängigkeiten. Sie benötigen eine Schnittstelle wie folgt zu erklären:

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

Während des Build (beispielsweise über Maven oder in Ihrem IDE), MapStruct wird eine Implementierung dieser Schnittstelle erzeugen, die im Grunde wie die original handgeschriebenen Code sieht. Wenn Sie interessiert sind, können Sie mehr in der reference guide herausfinden.

Verwandte Themen