Serialisierung mit JAXB

CHE123

Mitglied
Hallo,

bin nach verzweifelter suche nun hier gelandet und hoffe, dass mir mit meinem problem geholfen werden kann...
da ich gerne JAXB als framework verwenden würde, hänge ich nun bei folgendem fest:
es gibt ein interface, eine implementierung dessen und eine klasse mit einer collection des interfaces, das soll nach xml serialisiert werden.

erste ansatz (unofficial jaxb guide):

Java:
public interface Animal
{
  String getName();
}

Java:
@XmlRootElement
public class Lion implements Animal
{
  private String name = "Clarence";

  @XmlAttribute
  @Override
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Java:
@XmlRootElement
public class Zoo
{
  @XmlElement
  public List<Animal> animals = new ArrayList<Animal>();

  public static void main(String[] args)
  {
    final Zoo zoo = new Zoo();
    zoo.animals.add(new Lion());
    
    JAXB.marshal(zoo, System.err);
  }
}

gibt folgende exception:

Java:
Exception in thread "main" javax.xml.bind.DataBindingException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
test.jaxb.Animal is an interface, and JAXB can't handle interfaces.
        this problem is related to the following location:
                at test.jaxb.Animal
                at public java.util.List test.jaxb.Zoo.animals
                at test.jaxb.Zoo
test.jaxb.Animal does not have a no-arg default constructor.
        this problem is related to the following location:
                at test.jaxb.Animal
                at public java.util.List test.jaxb.Zoo.animals
                at test.jaxb.Zoo
                
usw...

zweiter ansatz nach ein wenig goggeln:

adapter klasse implementiert

Java:
public class XmlLionAdapter extends XmlAdapter<Lion, Animal>
{
  @Override
  public Animal unmarshal(Lion v) throws Exception {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public Lion marshal(Animal v) throws Exception {
    System.err.println(getClass().getSimpleName() + ": " + v.getClass());
    return (Lion) v;
  }
}

... und die anderen klassen entsprechend annotiert

Java:
@XmlJavaTypeAdapter(value=XmlLionAdapter.class) //<=== added
public interface Animal
{
  String getName();
}

Java:
@XmlRootElement
public class Zoo
{
  @XmlElement
  @XmlJavaTypeAdapter(value=XmlLionAdapter.class) //<=== added
  public List<Animal> animals = new ArrayList<Animal>();

  public static void main(String[] args)
  {
    final Zoo zoo = new Zoo();
    zoo.animals.add(new Lion());
    
    JAXB.marshal(zoo, System.err);
  }
}

die marshal-methode des adapters wird auch ausgeführt, allerdings kommt es zu folgendem
ergebnis:

[XML]<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<animals name="Clarence"/>
</zoo>
[/XML]

erwartet wäre allerdings nicht animals sonder lion, also
[XML]
...
<lion name="Clarence"/>
...
[/XML]

bin für jede hilfe dankbar;),

mfg,
christian
 

kidsos

Aktives Mitglied
Der entscheidende Punkt ist hier:
Java:
@XmlElement
public List<Animal> animals = new ArrayList<Animal>();
Der XML-Tag bildet sich hier aus dem Variablennamen. Durch
Code:
@XmlElement(name = "lion")
kannst du die XML-Ausgabe beeinflussen und damit auf "lion" umstellen.
 

CHE123

Mitglied
Danke für die Antworten!

@Nocatrius

Das Vertauschen der Argumente gibt leider folgende Exception:

Java:
Exception in thread "main" javax.xml.bind.DataBindingException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 3 counts of IllegalAnnotationExceptions
Adapter test.jaxb.XmlLionAdapter is not applicable to the field type java.util.List<test.jaxb.Animal>. 
        this problem is related to the following location:
                at @javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter(type=class javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT, value=class test.jaxb.XmlLionAdapter)
                at public java.util.List test.jaxb.Zoo.animals
                at test.jaxb.Zoo
usw...

@kidsos

Das ist schon richtig, allerdings hab ich noch Tiger und Bären im Zoo, die migrieren dann alle zu Löwen;)

mfg,
Christian
 

kidsos

Aktives Mitglied
Ich an deiner Stelle würde das Interface in eine abstrakte Basisklasse überführen. Die jeweiligen Tiere erben dann von Animal. Dadurch kannst du das dann beliebig erweitern. Ein schönes Beispiel, wie man dann Objekte vom Basistyp in eine Liste aufnehmen kann, ist z.B. hier (letzter Punkt "Hierarchien setzen" dürfte für dich interessant sein) erklärt.

Außerdem hast du ja noch das Problem mit dem XMLTypeAdapter. In deinem Fall wäre der ja nur für Lion-Objekte anwendbar. Für andere Objekte ginge das nicht.

Hoffe, dass dir das weiterhilft. ;)
 
Zuletzt bearbeitet:

CHE123

Mitglied
Hi,

@kidsos

yep:toll:! der schmäh is

Java:
  ...
  @XmlElementRefs({
    @XmlElementRef(type=Lion.class),
    @XmlElementRef(type=Tiger.class)
  })
  public List<Animal> animals = new ArrayList<Animal>();
  ...

>>>

[XML]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<zoo>
<lion name="Clarence"/>
<tiger name="Blunzn"/>
</zoo>[/XML]
da kann Animal ruhig ein interface bleiben und muss keine abstrakte Klasse werden...

Hab Dank! nu gehts ans deserialisieren...

EDIT: unmarshalling funktioniert auch!

mfg,
Christian
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Ahh cool das kannte ich auch noch nicht. Muss ich mir mal merken, auch wenn ich es an sich für unschön halte wenn man das extra noch deklarieren muss.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Jackson JSON: Dynamische Serialisierung XML & JSON 6
S XML-Serialisierung klappt nicht XML & JSON 5
E EMF Serialisierung XML XML & JSON 7
L Objekt Serialisierung: Schreiben aller Attribute erzwingen XML & JSON 5
F beste lib für xml serialisierung - deserialisierung XML & JSON 4
S XML-Serialisierung beeinflussen XML & JSON 5
G Serialisierung / Deserialisierung von XML mittels EMF XML & JSON 5
8u3631984 jaxb XML Mapper - Root Element mit Attribut XML & JSON 20
W jaxws jaxb wsdl Java-Klassen generieren und binding.xml verwenden XML & JSON 1
Rakshan Unmarshalling multiple namespaces with jaxb XML & JSON 0
B JAXB und HTML XML & JSON 1
E JAXB und java.nio.file.Path XML & JSON 4
W jaxb-api XML Feld nicht gesendet setzt das Defaultvalue nicht XML & JSON 3
S Muss ich bei JAXB immer noch eine zusaetzliche List-Wrapper Klasse erstellen wenn ich mehrere Objekte serialisieren will..? XML & JSON 1
S JAXB mit mehreren zusammenhängenden .xsd-Files XML & JSON 0
N JAXB: Überflüssiges Wrapper-Tag für Map-Einträge XML & JSON 0
D JAXB mit Map und Color XML & JSON 2
K JAXB-XML unvollständig XML & JSON 1
K JAXB Unmarshelling XML & JSON 1
E JAXB und abstrakte Klasse(n) XML & JSON 0
B JAXB - Unmarshal -> Kinder bekommen und die Kinder von den Kinder XML & JSON 7
B JAXB - Marshal ArrayList XML & JSON 2
B JAXB - java.util.Locale does not have a no-arg default constructor XML & JSON 2
B JAXB-Fehler bei REST-Api XML & JSON 0
M JAXB HashMap Dynamisches Laden XML & JSON 0
M JAXB @XMLID und @XMLIDREF, wie Daten hinzufügen XML & JSON 2
P JAXB-Problem XML & JSON 1
A JAXB: XMLMixed generieren XML & JSON 0
R [JAXB] XmlRootElement und XmlType gemeinsam nutzen XML & JSON 0
I XML to Object - Mapping mit JAXB 1.0 XML & JSON 1
L JAXB - Generischen Wert mit Liste belegen XML & JSON 1
M XML-Datei mit JAXB und 2 Namespaces XML & JSON 0
K JAXB Annotation @XMLRootElement vererben XML & JSON 0
F JAXB Unmarshal - Kein "default Constructor" XML & JSON 2
F.S.WhiTeY JAXB: Schema nicht "erben" XML & JSON 2
B JAXB - manuell Klassen aus xsd XML & JSON 3
S Jaxb Unmarshalling Problem XML & JSON 4
S JAXB - Any Elementliste - wie Werte verändern? XML & JSON 4
R JAXB: A cycle is detected in the object graph. This will cause infinitely deep XML XML & JSON 6
M JAXB versucht abstrakte Klasse zu erzeugen XML & JSON 7
M JAXB: automatisches Groß schreiben Property XML & JSON 9
C Projekt - JAXB, EMF oder doch DOM? XML & JSON 4
C JAXB: XML-Elemente einlesen und als XML-Attribute ausgeben XML & JSON 7
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
J JAXB: Mehrmals abspeichern XML & JSON 3
D XML Einlesen mit JaxB XML & JSON 4
W JAXB Binding customization XML & JSON 4
L JAXB und Interfaces XML & JSON 4
S Problem with JAXB unmarshalling classes that have the same name in @XmlRootElement XML & JSON 2
eykarhorn JAXB namespace attribut aus rootelement entfernen XML & JSON 2
nrg JAXB - nor any of its super class is known to this context XML & JSON 3
S aus XML mit JAXB zu Baumstruktur XML & JSON 3
nrg JAXB generell auf XMLs übertragbar XML & JSON 22
Landei JAXB: Wert von übergeordneten Element XML & JSON 4
B PropertyChangeListener generieren mit JAXB (xjc) XML & JSON 3
G JAXB und verschachtelte Elemente? XML & JSON 6
G JAXB XML-Attribute feststellen XML & JSON 4
S JAXB 2 und JSR 303 XML & JSON 11
M [JAXB] @XmlAnyElement namespace XML & JSON 4
R JAXB Unmarshal XML & JSON 2
J JAXB und ArrayList XML & JSON 4
Landei Jpa2 -> jaxb??? XML & JSON 9
M JAXB - HashMap XML & JSON 1
dzim JAXB-Unmarshalling ignoriert/löscht Einträge aus XML - oder lässt sie verschwinden XML & JSON 3
S JAXB 2 und Java Annotationen/Interfaces generieren XML & JSON 3
ruutaiokwu jaxb eclipse plugin... XML & JSON 3
K JAXB: Klassen mit Annotation Lesen/Schreiben XML XML & JSON 3
R JAXB ausgewählte Felder XML & JSON 10
TiME-SPLiNTER JAXB: com.sun.xml.bind.v2.ContextFactory XML & JSON 3
V JAXB und leere Listen XML & JSON 2
L compareto(), equals() in JAXB generierten Dateien XML & JSON 3
D jaxb validierung/verification vor marshalling XML & JSON 3
J JAXB mit GregorianCalendar XML & JSON 4
HombreDelMundo JAXB can't handle interfaces XML & JSON 4
N Individuelles Wrapper-Element um Collection mit JAXB XML & JSON 6
B JAXB Unmarshalling mehrerer Objekte XML & JSON 2
V JAXB schema 2 java XML & JSON 3
B JPA + JAXB Mapping Problem XML & JSON 2
S Navigieren in unbekannten JAXB-Objecten XML & JSON 2
J JAXB NullPointerException im ContextFinder XML & JSON 6
H JAXB und STAX XML & JSON 2
H JAXB Probleme beim Unmarshalling XML & JSON 3
K JAXB und Maps -> Marshalling-Problem XML & JSON 6
S JAXB und viele verschachtelte Attribute XML & JSON 1
J JAXB - Map XML & JSON 2
O JAXB generierte Klassen sollen Serializable implementieren XML & JSON 1
aze JaxB: Nullelemente in Array nicht anzeigen XML & JSON 3
turmaline JAXB can't handle interfaces XML & JSON 20
sambalmueslie JAXB - Unmarshall ein XML-Document das aus zwei XSD Definitionen besteht XML & JSON 8
S JAXB und abstrakte Klasse(n) XML & JSON 4
P JAXB: Marshalling XML & JSON 7
aze JaxB Elemente in LinkedHashSet werden nicht wiededergegeben XML & JSON 3
M JAXB: Wie folgendes Konstrukt abbilden? XML & JSON 20
A Jaxb und Interfaces XML & JSON 12
B JaxB und XSD :-) XML & JSON 8
G JAXB - Marshaller - kein Rückgabewert XML & JSON 2
N XML will nicht weder JAXB noch XStream XML & JSON 8
F Zugriff auf durch JAXB erzeugte Object-Struktur... XML & JSON 6
C Java-Imports bei Jaxb XML & JSON 8
F Marshaling eines JAXB Objektes worin ein anderes JAXB Objekt eingeschlossen ist XML & JSON 6

Ähnliche Java Themen

Neue Themen


Oben