Gibt es ein Tool für die Zuordnung von Java-Objekt zu Objekt? [geschlossen]

231

Ich versuche, DO mit Java in DTO zu konvertieren und suche nach einem automatisierten Tool, bevor ich anfange, mein eigenes zu schreiben. Ich wollte nur wissen, ob es dafür ein kostenloses Tool gibt.

Ravinikam
quelle
1
Jackson (die JSON-Bibliothek) hat eine Methode new ObjectMapper().convertValue(...). Jackson unterstützt auch Annotationen und Annotation-Mixins, daher finde ich das eine sehr gute Option.
Simon Forsberg
1
Hier ist ein Artikel mit verschiedenen Frameworks und Leistungsvergleichen. baeldung.com/java-performance-mapping-frameworks
Christian

Antworten:

105

Sie könnten Dozer versuchen .

Dozer ist ein Java Bean-zu-Java-Bean-Mapper, der rekursiv Daten von einem Objekt zu einem anderen kopiert. In der Regel handelt es sich bei diesen Java-Beans um verschiedene komplexe Typen.

Dozer unterstützt die einfache Zuordnung von Eigenschaften, die Zuordnung komplexer Typen, die bidirektionale Zuordnung, die implizit-explizite Zuordnung sowie die rekursive Zuordnung. Dies umfasst das Zuordnen von Sammlungsattributen, die auch auf Elementebene zugeordnet werden müssen.

Skaffman
quelle
24
Sehr, sehr lange danach komme ich, um ein Update zu machen. Ich hoffe, mein Kommentar wird gelesen: Jetzt scheint Dozer tot zu sein, und eine gute Option ist die Verwendung von MapStruct. Es ist einfach (Support-Anmerkungen), schnell (keine Reflexion) ) und scheint (im Moment) sicher zu sein. Dies ist zwar in der @ Pascal Thivent-Liste enthalten, aber ich rate dazu (auch wenn ich Probleme hatte, es zusammen mit Lombok zu verwenden).
Alex
2
Dozer scheint mit Version 6 wiederbelebt zu sein: mvnrepository.com/artifact/com.github.dozermapper/dozer-core
tkruse
394

Es gibt dort einige Bibliotheken:

  • Commons-BeanUtils : ConvertUtils -> Dienstprogrammmethoden zum Konvertieren von String-Skalarwerten in Objekte der angegebenen Klasse, String-Arrays in Arrays der angegebenen Klasse.

  • Commons-Lang : ArrayUtils -> Operationen an Arrays, primitiven Arrays (wie int []) und primitiven Wrapper-Arrays (wie Integer []).

  • Spring-Framework : Spring bietet eine hervorragende Unterstützung für PropertyEditors, mit denen auch Objekte in / aus Strings transformiert werden können.

  • Dozer : Dozer ist ein leistungsstarker und dennoch einfacher Java Bean-zu-Java Bean-Mapper, der rekursiv Daten von einem Objekt zu einem anderen kopiert. In der Regel handelt es sich bei diesen Java-Beans um verschiedene komplexe Typen.

  • ModelMapper : ModelMapper ist ein intelligentes Framework für die Objektzuordnung, das Objekte automatisch einander zuordnet. Es verwendet einen konventionellen Ansatz zum Zuordnen von Objekten und bietet gleichzeitig eine einfache Refactoring-sichere API für die Behandlung bestimmter Anwendungsfälle.

  • MapStruct : MapStruct ist ein Codegenerator zur Kompilierungszeit für Bean-Zuordnungen, der zur Laufzeit zu schnellem (ohne Verwendung von Reflection oder ähnlichem), abhängigkeitslosem und typsicherem Zuordnungscode führt.

  • Orika : Orika verwendet die Bytecode-Generierung, um schnelle Mapper mit minimalem Overhead zu erstellen.

  • Selma : Codegenerator zur Kompilierungszeit für Zuordnungen

  • JMapper : Bean Mapper-Generierung mit Annotation, XML oder API (scheint tot zu sein, zuletzt aktualisiert vor 2 Jahren)

  • Smooks : Mit der Smooks JavaBean Cartridge können Sie Java-Objekte aus Ihren Nachrichtendaten erstellen und füllen (dh Daten an binden) (vorgeschlagen von Superfilin in Kommentaren). (Nicht mehr in aktiver Entwicklung)

  • Commons-Convert : Commons-Convert zielt darauf ab, eine einzelne Bibliothek bereitzustellen, die der Aufgabe gewidmet ist, ein Objekt eines Typs in einen anderen zu konvertieren. Die erste Phase konzentriert sich auf die Konvertierungen von Objekt zu Zeichenfolge und von Zeichenfolge zu Objekt. (scheint tot zu sein, letztes Update 2010)

  • Transmorph : Transmorph ist eine kostenlose Java-Bibliothek, mit der ein Java-Objekt eines Typs in ein Objekt eines anderen Typs konvertiert wird (mit einer anderen Signatur, möglicherweise parametrisiert). (scheint tot zu sein, letztes Update 2013)

  • EZMorph : EZMorph ist eine einfache Java-Bibliothek zum Transformieren eines Objekts in ein anderes Objekt. Es unterstützt Transformationen für Grundelemente und Objekte, für mehrdimensionale Arrays und Transformationen mit DynaBeans (scheint tot, zuletzt aktualisiert 2008).

  • Morph : Morph ist ein Java-Framework, das die interne Interoperabilität einer Anwendung erleichtert. Während Informationen durch eine Anwendung fließen, werden sie mehreren Transformationen unterzogen. Morph bietet eine Standardmethode zum Implementieren dieser Transformationen. (scheint tot zu sein, letztes Update 2008)

  • Lorentz : Lorentz ist ein generisches Objekt-zu-Objekt-Konvertierungsframework. Es bietet eine einfache API zum Konvertieren von Java-Objekten eines Typs in ein Objekt eines anderen Typs. (scheint tot zu sein)

  • OTOM : Mit OTOM können Sie alle Daten von jedem Objekt auf jedes andere Objekt kopieren. Die Möglichkeiten sind endlos. Willkommen bei "Autumn". (scheint tot zu sein)

Pascal Thivent
quelle
Keine der Listen unterstützt Anmerkungen :(
Ravinikam
1
Commons-Convert scheint nicht nur ruhend, sondern jetzt komplett verschwunden zu sein ...
Jim Ferrans
Wenn Sie Moo zu Ihrer Liste hinzufügen möchten, kann ich meine Antwort entfernen, da Ihre Antwort eindeutig weitaus vollständiger ist. ;)
Geoffrey Wiseman
3
Eine weitere Option für Java 8+: erchu.github.io/bean-cp (Haftungsausschluss: Ich bin der Autor dieses Projekts)
Rafal
1
@TmTron: Fertig und ich haben die Antwort bearbeitet, um den Streik zu entfernen und auf die Repo-URL zu verweisen (da die Hauptseite immer noch auf 0.7.5 verweist)
patric.schenke
31

Eine andere ist Orika - https://github.com/orika-mapper/orika

Orika ist ein Java Bean-Mapping-Framework, das (unter anderem) rekursiv Daten von einem Objekt in ein anderes kopiert. Dies kann bei der Entwicklung mehrschichtiger Anwendungen sehr nützlich sein.

Orika konzentriert sich darauf, so viel wie möglich zu automatisieren und bei Bedarf Anpassungen durch Konfiguration und Erweiterung vorzunehmen.

Orika ermöglicht dem Entwickler:

  • Komplexe und tief strukturierte Objekte abbilden
  • Objekte "reduzieren" oder "erweitern", indem verschachtelte Eigenschaften Eigenschaften der obersten Ebene zugeordnet werden und umgekehrt
  • Erstellen Sie Mapper im laufenden Betrieb und wenden Sie Anpassungen an, um einige oder alle Mappings zu steuern
  • Erstellen Sie Konverter für die vollständige Kontrolle über die Zuordnung eines bestimmten Satzes von Objekten an einer beliebigen Stelle im Objektdiagramm - nach Typ oder sogar nach einem bestimmten Eigenschaftsnamen
  • Behandeln Sie Proxys oder erweiterte Objekte (wie die von Hibernate oder die verschiedenen Mock-Frameworks).
  • Wenden Sie bidirektionales Mapping mit einer Konfiguration an
  • Zuordnung zu Instanzen einer geeigneten konkreten Klasse für eine abstrakte Zielklasse oder -schnittstelle
  • Behandeln Sie umgekehrte Zuordnungen
  • Behandeln Sie komplexe Konventionen, die über die JavaBean-Spezifikationen hinausgehen.

Orika verwendet die Bytecode-Generierung, um schnelle Mapper mit minimalem Overhead zu erstellen.

Tomas
quelle
2
Sie könnten ein paar Worte über Orika geben - was unterscheidet es von den anderen
Olimpiu POP
Es ist wahrscheinlich viel schneller als Dozer - Dozer ist ziemlich langsam.
Ondrej Bozek
21

ModelMapper ist eine weitere Bibliothek, die einen Besuch wert ist. Das Design von ModelMapper unterscheidet sich von anderen Bibliotheken darin, dass es:

  • Ordnet Objektmodelle automatisch zu, indem Quell- und Zieleigenschaften intelligent aufeinander abgestimmt werden
  • Bietet eine Refactoring-API für die sichere Zuordnung, die den tatsächlichen Code verwendet, um Felder und Methoden zuzuordnen, anstatt Zeichenfolgen zu verwenden
  • Verwendet die konventionsbasierte Konfiguration zur einfachen Handhabung benutzerdefinierter Szenarien

Weitere Informationen finden Sie auf der ModelMapper-Website:

http://modelmapper.org

Jonathan
quelle
13

Verwenden Sie Apache Commons Beanutils:

static void copyProperties(Object dest, Object orig) -Kopieren Sie die Eigenschaftswerte von der Ursprungs-Bean zur Ziel-Bean für alle Fälle, in denen die Eigenschaftsnamen identisch sind.

http://commons.apache.org/proper/commons-beanutils/

Pablojim
quelle
3
Ja, aber Eigenschaften, die sich in der Quell-Bean, aber nicht in der Ziel-Bean befinden, werden einfach ignoriert. Trotzdem danke Pablojim :) Ich denke, ich muss mit Dozer gehen, da wir einige unterschiedliche Eigenschaftsnamen für DO und DTO haben :(
ravinikam
1
Fair genug - ich wusste das nicht ... Pascals Liste war ziemlich beeindruckend!
Pablojim
3

Ich schlage vor, Sie versuchen JMapper Framework .

Es ist ein Java-Bean-zu-Java-Bean-Mapper, mit dem Sie die Datenübertragung dynamisch mit Anmerkungen und / oder XML durchführen können.

Mit JMapper können Sie:

  • Erstellen und bereichern Sie Zielobjekte
  • Wenden Sie eine bestimmte Logik auf das Mapping an
  • Verwalten Sie die XML-Datei automatisch
  • Implementieren Sie die Beziehungen 1 zu N und N zu 1
  • Implementieren Sie explizite Konvertierungen
  • Wenden Sie geerbte Konfigurationen an
Alessandro
quelle
2

Ich bin froh, Moo als Option hinzuzufügen, obwohl ich eindeutig voreingenommen bin: http://geoffreywiseman.github.com/Moo/

Es ist sehr einfach für einfache Fälle zu verwenden, vernünftigerweise für komplexere Fälle geeignet, obwohl es noch einige Bereiche gibt, in denen ich mir vorstellen kann, es für noch weitere Komplexitäten zu verbessern.

Geoffrey Wiseman
quelle
2

Sie können auch versuchen, ein Mapping-Framework basierend auf Dozer, jedoch mit einer Excel-Mapping-Deklaration, zu erstellen. Sie haben einige Tools und zusätzliche coole Funktionen. Überprüfen Sie unter http://openl-tablets.sf.net/mapper

Ivan
quelle