JAXB @ XmlElements, verschiedene Typen, aber gleicher Name?

8

Ich habe eine Animal-Klasse und eine Erweiterung von Animal namens AnimalExtension.

%Vor%

Der einzige Unterschied zwischen den beiden Klassen besteht darin, dass AnimalExtension eine andere Instanzvariable namens animalId hat. Animal hat diese Instanzvariable nicht.

Ich habe auch meinen eigenen Datentyp, den ich in XML marshale und unmarshale. Dieser Datentyp heißt AnimalList. In AnimalList gibt es eine Liste von Animals als Instanzvariable.

%Vor%

animalList kann Animal und AnimalExtension enthalten. In der XML möchte ich jedoch nicht, dass das Element als AnimalExtension benannt wird. Ich möchte, dass sie alle den Elementnamen von Animal haben. Ich möchte nur, dass das zusätzliche Attribut angezeigt wird, wenn JAXB weiß, dass das Animal tatsächlich eine Instanz von AnimalExtension ist. Also, wenn ich eine Liste habe, sieht das aus wie

%Vor%

Ich möchte, dass das XML wie folgt aussieht

%Vor%

Das habe ich versucht zu tun

%Vor%

Der Code wird kompiliert, aber wenn ich versuche, meinen Server auszuführen. Es gibt mir diesen seltsamen Fehler, der mit dem, was gerade passiert, nichts zu tun hat (BeanCreationException). Ich habe versucht, den Namen des XmlElement für jeden Typ anders zu machen, und das funktioniert, aber die Herausforderung besteht darin, den Namen gleich zu machen.

%Vor%     
denniss 15.02.2011, 18:01
quelle

1 Antwort

9

Um diesen Anwendungsfall zuzuordnen, könnten Sie die folgenden XmlAdapter verwenden:

AnimalAdapter

Da AnimalExtension eine große Menge von Animal ist, werden wir es verwenden, um XML zu erzeugen / konsumieren. Dann werden wir den Wert der animalId-Eigenschaft nutzen, um festzustellen, ob eine Instanz von Animal oder AnimalExtension an AnimalList zurückgegeben wird.

%Vor%

IDAdapter

Wir brauchen einen zweiten XmlAdapter, um animalId zu unterdrücken, wenn sein Wert 0 ist:

%Vor%

Ihre Modellklassen werden wie folgt kommentiert:

AnimalList

%Vor%

Tier

%Vor%

AnimalExtension

%Vor%

Democode

Der folgende Democode kann verwendet werden, um diese Lösung zu demonstrieren:

%Vor%

Die folgende Ausgabe wird erzeugt:

%Vor%

Zugehörige Informationen

Sie können die folgenden Informationen nützlich finden:

Blaise Doughan 18.02.2011, 14:31
quelle

Tags und Links