Ich habe einige Jaxb-Objekte (die aus Code erzeugt wurden, der von xsd von jaxb generiert wurde), die ich klonen muss. Die Jaxb-Klasse scheint keine Schnittstelle zu bieten, um dies leicht durchzuführen. Ich kann die Klasse nicht manuell editieren und kann sie nicht erweitern - also muss ich dafür eine Hilfs- / Hilfsmethode erstellen. Was ist der beste Ansatz?
Angesichts des Zwecks von JAXB denke ich, dass der einfachste Weg darin besteht, Ihr Objekt auf XML zu marshallieren und es zurückzumelden.
Es gibt viel mehr Diskussionen zu Google .
JAXB FAQ schlägt vor Beanlib .
Es gibt auch eine Diskussion (sowie einen Link zum Download) eines Cloneable-Plugins unter jaxb2 -commons, obwohl ich keinen Verweis auf der Projektseite finden kann.
Sie können das kopierfähige Plugin verwenden. Es erzeugt tiefe Kopier- / Klon-Methoden (die sogar mit Strategien angepasst werden können).
Ich habe Benchmarks für verschiedene Lösungen zum Klonen eines JAXB-Objekts ausgeführt. Hier sind einige Ergebnisse:
Das mofokom xjc-clone-Plugin scheint am schnellsten zu sein Lösung. Es lässt einfach all Ihre generierten Artefakte Cloneable
implementieren und überschreibt sie öffentlich Object.clone()
. Leider hat dies Maver Central (noch) nicht erreicht.
Erzeugung von Serializable
Artefakten und deren Serialisierung / Deserialisierung ein Dummy-Stream ist 10x langsamer als die Java-Klonierungsmechanismen:
Das Marshalling / Unmarshalling der JAXB-Objekte ist wiederum 5x langsamer als das Serialisieren / Deserialisieren. Dies schlägt ykaganovichs Lösung vor:
%Vor%Dies ist ein alter Thread, aber ich musste auch klonbare JAXB-Domänenobjekte erstellen, und ich denke, Marshalling - das Unmarshalling ist sicher nicht die beste Lösung.
Idealerweise sollten Sie die Objekte im Speicher kopieren, indem Sie generierte Klonmethoden verwenden. Es gibt ein Maven-Plugin ( maven-jaxb2-plugin ), das Sie für diesen Zweck verwenden können.
Dies sind die relevanten Abschnitte in meiner Maven pom.xml-Datei:
%Vor%...
%Vor%Beachten Sie das Argument -Xcopyable , das die Klonmethode innerhalb aller Objekte generiert.
Wenn Sie
verwenden %Vor%Zum Erstellen des Projekts werden die Domänenklassen mit einer Clone-Implementierung generiert.
Dies ist ein Auszug der klonbezogenen Methoden in einer der Domänenklassen:
%Vor%Sie können die Quellen und Beispiele des jaxb2 basics Projekts auf dieser Seite finden:
Die Releases mit nützlichen Beispielen können hier heruntergeladen werden:
Wir haben das jaxb2-basics-Plugin verwendet - es ist in Maven Repo verfügbar, fügt nur eine einzige Abhängigkeit hinzu und kann auch verwendet werden, um andere nützliche Dinge zu erzeugen: equals, hashCode, toString, Standardwerte usw. Bitte beachten Sie diesen Link für Details: Ссылка