Erzeugen von hashCode () und equals () beim Erstellen von Java-Klassen mit dem Mojo Jaxb2 maven-Plugin

8

Der Code, an dem ich arbeite, verwendet jaxb2-maven-plugin from org.codehaus.mojo , um Java-Klassen vom XSD-Schema zu generieren. Ich suche nach einer Möglichkeit, equals() und hashCode() Methoden für diese Klassen automatisch zu implementieren, aber es scheint, dass es keinen Weg gibt. Ich weiß, dass es andere JAXB2 Maven Plugins gibt, die das tun (http://confluence.highsource.org/display/J2B/Home zum Beispiel), aber ich habe mich gefragt, ob irgendjemand von euch dieses Problem schon einmal bemerkt hat und ob es einen Weg dafür gibt es reparieren. Ich erzeuge die Klassen mit dem xjc -Ziel.

    
manub 30.01.2012, 10:37
quelle

6 Antworten

13

JAXB2 Basics, die Sie erwähnen, sind keine Eigenschaft von maven-jaxb2-plugin , es ist ein eigenständiges Set von JAXB 2.x Plugins, die Sie mit XJC - oder jaxb2-maven-plugin oder was auch immer verwenden können.

%Vor%

Was ich fragen wollte - warum nicht einfach maven-jaxb2-plugin verwenden? Es hat so viel mehr Funktionalität im Vergleich zum Codehaus-Plugin - einschließlich Konfigurationsunterstützung für JAXB2-Plugins.

    
lexicore 03.02.2012, 22:58
quelle
4

Ich würde der Verwendung JAXB-generierter Klassen als Geschäftsobjekte in Ihrem Code nicht zustimmen. Die Klassen, die von JAXB generiert werden, sind Beans, die dazu bestimmt sind, Elementinformationen im Wesentlichen aus der XML-Datei in die Felder der Bean zu verschieben. Ich persönlich habe immer meinen SOAP-Service, um diese generierten Bean-Klassen in meine eigentlichen Geschäftsobjekte zu konvertieren, da XML- & gt; Java und umgekehrt die Konvertierung nicht immer schwarz-weiß ist. Beachten Sie, dass dies meine persönliche Meinung ist, und würde gerne einige andere darüber nachdenken, was sie in dieser Situation tun.

Um jedoch Ihre Frage zu beantworten, verwenden Sie ein anderes Plug-in oder verwenden Sie einfach Ihre IDE, um einige equals- und hashCode-Methoden zu erstellen.

Ich hoffe, das hilft.

BEARBEITEN:

Ich habe vergessen, meine Gründe dafür zu entschuldigen. Lassen Sie uns in der nächsten Version Ihres Projekts sagen, dass Sie Ihren von JAXB generierten Klassen etwas mehr Verhalten hinzufügen möchten, aber auch einige Änderungen an Ihrem Schema vornehmen möchten. Jetzt generierst du die von JAXB generierten Klassen neu, stellst die alten Verhaltensweisen wieder ein und machst deine Anwendung meiner Meinung nach viel anfälliger für Fehler. Die von JAXB generierten Klassen sollen Ihre XML-Schematypen (und damit Ihre SOAP-Nachrichten) nicht Ihrer Geschäftslogik entsprechen. Hoffnung, die Sinn macht.

    
thatidiotguy 30.01.2012 18:38
quelle
2

Sie können auch die Verwendung eines in Betracht ziehen fluent builder interface (erleichtert die Handhabung der generierten JAXB-Klassen) und einen Verweis auf eine Katalogdatei für den Fall, dass Sie auf ein xmldsig-core-schema verweisen (beschleunigt den Generierungsprozess, da keine entfernten Schemas aus W3C abgefragt werden) - Ihre Server verzögern normalerweise die Antwort.

%Vor%

So sieht die Katalogdatei aus:

%Vor%

Und hier ist der Link zum xmldisg-core-schema.xsd: Ссылка

Bitte beachten Sie, dass die Verbindung nicht unterbrochen ist - der W3C-Server verzögert die Antwort nur ein paar Sekunden. Kann mich sehr umständlich, wenn das während Ihres automatisierten Build-Prozesses, der JAXB-Generation enthält, passiert.

    
Philipp 09.10.2012 16:33
quelle
2

Dies ist der einfachste Weg. Bitte aktualisieren Sie die Version gemäß Ihren Anforderungen.

%Vor%     
Atish Narlawar 29.10.2013 15:41
quelle
1

Meine Antwort ist für diejenigen, die sich keine Abhängigkeit von ihrem generierten Code leisten können.

Das org.jvnet.jaxb2_commons: jaxb2-basics Plugin fügt ein Viele org.jvnet enthalten im generierten Code und Ihr Projekt hängt von org.jvnet.jaxb2_commons:jaxb2-basics-runtime ab.

Die org.andromda.thirdparty.jaxb2_commons: commons-lang-plugin Plugin erzeugt Code, der von commons-lang:commons-lang abhängt. Diese Abhängigkeit ist je nach Situation leichter zu ertragen.

Ich habe schließlich diesen Quellcode gefunden , er könnte in com.sun.xml.bind:jaxb-xjc irgendwann (Version 2.2.4?), aber bis dahin kann ich Ich sehe keine andere Lösung, als ein eigenes Plugin zu schreiben.

PS: Ich kann nicht auf confluence.highsource.org zugreifen, ich bekomme einen 404. I denke, es könnte hilfreich gewesen sein.

PPS: In meiner Situation ist die Anwendung, die ich erstelle, auf eine Umgebung ausgerichtet, die nur sehr begrenzte erlaubte Java-Bibliotheken hat (nicht übereinstimmende Sicherheitsbeschränkungen). Ich war etwas enttäuscht von der Tatsache, dass jaxb2_commons eine Menge org.jvnet Abhängigkeiten in der generierten Quelle enthält, nur um eine langweilige equals Methode hinzuzufügen. Ich kann die Strategie von Jvnet verstehen, ihre Werkzeuge sind sehr kraftvoll, ich kann nur versuchen und einen Vorschlaghammer benutzen, um eine Nuss zu knacken. Trotzdem bedauerte ich, dass es so schwierig war, ein geeignetes Werkzeug für meine Situation zu finden.

    
boumbh 04.09.2013 10:02
quelle
1

Es gibt auch ein fluent-builder-Plugin für JAXB, das nicht unbedingt Abhängigkeiten zu Drittanbieter-Code generiert. Außerdem ist es ein echtes "Builder" -Designmuster, während das "fluent-api" -Plugin den generierten Klassen nur Builder-ähnliche Methoden hinzufügt. Es ist: Ссылка Es verfügt auch über Optionen, um die generierten Klassen unveränderlich zu machen, und es können Methoden generiert werden, um den Status vorhandener Objekte in eine neue Builder-Instanz zu kopieren, wobei auch "partielle" Objektkopien unterstützt werden.

    
Mirko Klemm 23.02.2015 10:33
quelle

Tags und Links