JAXB 2.x: Wie überschreibe ich eine XmlElement-Annotation von der übergeordneten Klasse - Mission Impossible?

8

Warum ist das nicht möglich? Es scheint so einfach, aber es verhält sich nicht wie erwartet.

Zusammenfassung: Klasse A verwendet eine aggregierte DataA-Bean, während Klasse B (eine Unterklasse der Klasse A) eine aggregierte DataB-Bean verwendet (während DataB DataA erweitert).

Ich habe diese Testklassen geschrieben, um meine Frage zu visualisieren und zu erklären:

Klasse A:

%Vor%

und seine DataA-Klasse (ich habe die FIELD-Annotation verwendet, damit alle Felder gemarshallt werden):

%Vor%

Und nun die Klasse B (Unterklasse der Klasse A): Mein Ziel ist es, die Funktionalitäten von A wiederzuverwenden und die Eigenschaften aus der DataA-Bean wiederzuverwenden, indem ich die DataB-Bean verwende:

%Vor%

Die entsprechende DataB-Bean sieht folgendermaßen aus:

%Vor%

Nun, wenn ich eine Instanz der Klasse A marschalliere, gibt es diese Ausgabe:

%Vor%

Wenn ich eine Instanz der Klasse B marshalliere, bekomme ich das gleiche Ergebnis:

%Vor%

Aber ich erwartete, dass auch String3 marshalled werden würde, aber es schreibt nur die Eigenschaften von Bean DataA! WARUM? Dies ist nicht wirklich intuitiv, wenn es um OOP geht.

Wenn ich die @ XmlElement-Annotation auch auf die Klasse B setze ... so:

%Vor%

... dann wird die Eigenschaft zweimal gemarshallt, weil sie einmal sowohl von der Elternklasse als auch von der Kindklasse kommentiert wird. Das will ich auch nicht:

Die Ausgabe ist jetzt:

%Vor%

Was ich von JAXB erwartet habe, ist das folgende XML:

%Vor%

Irgendwelche Hinweise, wie man JAXB zwickt, um das erwartete Ergebnis zu erzielen ?? Vielen Dank für Feedback.

    
basZero 11.01.2011, 18:32
quelle

4 Antworten

3

Beschriften Sie die Quelleigenschaft in Klasse B einfach nicht. Die Quelleigenschaft wurde der übergeordneten Klasse zugeordnet und sollte in der untergeordneten Klasse nicht erneut zugeordnet werden. Da Sie die get / set-Methoden mit Anmerkungen versehen, wird das entsprechende get / set für die Klasse B aufgerufen.

%Vor%

AKTUALISIEREN

Es kann einen Fehler im Metro JAXB (Referenzimplementierung) geben. Wenn ich dieses aktualisierte Beispiel mit EclipseLink JAXB (MOXy) ausführe, bekomme ich folgende Ausgabe:

%Vor%

Dies kann mit dem folgenden Code reproduziert werden:

%Vor%

Um MOXy als JAXB-Implementierung zu verwenden, müssen Sie eine Datei namens jaxb.properties im Modellpaket (test) mit dem folgenden Eintrag angeben:

%Vor%     
Blaise Doughan 11.01.2011, 18:48
quelle
1

Sie müssen MOXy nicht benutzen .. Ändern Sie einfach die Klasse B und verwenden Sie @XmlAlso.

%Vor%

WIRD ENDLICH SCHREIBEN:

%Vor%     
elcin 10.02.2011 14:19
quelle
0

Vielen Dank Blaise für all diese Hinweise. MOXy funktioniert jetzt gut mit meiner realen Anwendung mit echten Bohnen. schön!

Der einzige Nachteil, den ich derzeit habe, ist, dass die letzte Zeile in diesem Konfigurationscode nicht mehr funktioniert, weil MOXy natürlich einen anderen Namespace-Prefix-Mapping-Mechanismus verwendet.

Haben Sie einen Zeiger dafür? Ich habe die MOXy-Dokumentation durchsucht und nach Namespace gesucht, aber nichts Ähnliches wurde gefunden.

%Vor%     
basZero 11.01.2011 20:42
quelle
0

Sie können diese Methode verwenden:

%Vor%

diese Zuordnung funktionierte für mich.

    
user1620801 20.03.2013 21:35
quelle