Hallo liebe Java-Gemeinde,
ich war bisher seit einigen Wochen passiver Leser und suche nun Hilfe bei einem Problem, welches ich schon etwas laenger habe.
Bisher im Netz, auch bei den Sun-Blogs, aber nichts brauchbares gefunden habe.
Zu meinem Problem:
Ich habe ein Listenelement welches verschiedene Arten Objekten (über ein gemeinsames Interface Fahrzeug) aufnehmen kann, aber immer nur vom gleichen Typ zu einem Zeitpunkt.
Beispielhaft moechte ich zur Veranschaulichung das Problem mit Fahrzeugen vom Typ Auto und Motorrad erklaeren.
Also etwa so (in der Liste befinden sich zunaechst Fahrzeuge vom Typ Auto):
Zu einem anderem Zeitpunkt können in der Liste Fahrzeuge vom Typ Motorrad sein:
Mit JAXB kann man die Liste mit Hilfe von Element Referenzen nach folgender Art mappen:
Es gibt die Annotation @XmlElementWrapper, aber diese kann nur einmal über dem Feld "Fahrzeuge"
angegeben werden.
Mir ist klar, dass das Wrapper-Element auch einfach "Fahrzeug" heissen koennte, aber das XSD - Schema gibt es halt so vor, das wenn sich in der Liste Auto-Typen befinden auch das Elternelement "Autos" heisst und bei Motorraedern eben "Motorraeder".
Wünschenswert waere beim Mapping so etwas zu machen (um es nochmal auf den Punkt zu bringen):
So eine Annotation gibt es aber nicht.
Ich habe mir z.Z. so geholfen, dass ich neben der Liste "fahrzeuge" noch 2 weitere 'konkrete' Listen halte, in die ich die jeweiligen Elemente aus der Fahrzeug-Liste umkopiere.
Die beiden extra Listen sind mit dem jeweiligen @XmlElementWrapper Annotation versehen, damit das Gewünschte rauskommt.
Das hin- und herkopieren ist aber unschön, denn gearbeitet wird eigentlich nur mit der Fahrzeug-Liste und nur dafür gibt es Zugriffsmethoden.
Fuer das Marschallen und Unmarschallen muss ich also noch extra Aufwand treiben, damit ich dem Schema entspreche (nach Marshall) bzw. die Fahrzeug-Liste gefuellt bekomme (nach Unmaraschall).
Wie schaffe ich es, dass je nach Fahrzeugtypen in der Liste das Wrapper-Element mal "Autos" und mal "Motorraeder" heisst mit JAXB-Mitteln ?
Ich hoffe das war jetzt nicht zu lang, um das Problem zu erklaeren
Vielen Dank schon mal fuer Tipps und Tricks im Voraus.
ich war bisher seit einigen Wochen passiver Leser und suche nun Hilfe bei einem Problem, welches ich schon etwas laenger habe.
Bisher im Netz, auch bei den Sun-Blogs, aber nichts brauchbares gefunden habe.
Zu meinem Problem:
Ich habe ein Listenelement welches verschiedene Arten Objekten (über ein gemeinsames Interface Fahrzeug) aufnehmen kann, aber immer nur vom gleichen Typ zu einem Zeitpunkt.
Beispielhaft moechte ich zur Veranschaulichung das Problem mit Fahrzeugen vom Typ Auto und Motorrad erklaeren.
Also etwa so (in der Liste befinden sich zunaechst Fahrzeuge vom Typ Auto):
<Autos>
</Autos>
<Fahrzeug name="BMW"/>
<Fahrzeug name="AUDI"/>
...</Autos>
Zu einem anderem Zeitpunkt können in der Liste Fahrzeuge vom Typ Motorrad sein:
<Motorraeder>
</Motorraeder>
<Fahrzeug name="KAWASKI"/>
<Fahrzeug name="HONDA"/>
...</Motorraeder>
Mit JAXB kann man die Liste mit Hilfe von Element Referenzen nach folgender Art mappen:
Java:
@XmlElementRefs(value = {
@XmlElementRef(type = Auto.class, name = "Fahrzeug", required = false),
@XmlElementRef(type = Motorrad.class, name = "Fahrzeug", required = alse)
List<Fahrzeug>fahrzeuge = new ArrayList<Fahrzeug>();
Es gibt die Annotation @XmlElementWrapper, aber diese kann nur einmal über dem Feld "Fahrzeuge"
angegeben werden.
Mir ist klar, dass das Wrapper-Element auch einfach "Fahrzeug" heissen koennte, aber das XSD - Schema gibt es halt so vor, das wenn sich in der Liste Auto-Typen befinden auch das Elternelement "Autos" heisst und bei Motorraedern eben "Motorraeder".
Wünschenswert waere beim Mapping so etwas zu machen (um es nochmal auf den Punkt zu bringen):
Java:
@XmlElementWrappers(value = {
@XmlElementWrapper(type = Auto.class, name = "Autos"),
@XmlElementWrapper(type = Motorrad.class, name = "Motorraeder") })
@XmlElementRefs(value = {
@XmlElementRef(type = Auto.class, name = "Fahrzeug", required = false),
@XmlElementRef(type = Motorrad.class, name = "Fahrzeug", required = alse) })
List<Fahrzeug>fahrzeuge = new ArrayList<Fahrzeug>();
So eine Annotation gibt es aber nicht.
Ich habe mir z.Z. so geholfen, dass ich neben der Liste "fahrzeuge" noch 2 weitere 'konkrete' Listen halte, in die ich die jeweiligen Elemente aus der Fahrzeug-Liste umkopiere.
Die beiden extra Listen sind mit dem jeweiligen @XmlElementWrapper Annotation versehen, damit das Gewünschte rauskommt.
Das hin- und herkopieren ist aber unschön, denn gearbeitet wird eigentlich nur mit der Fahrzeug-Liste und nur dafür gibt es Zugriffsmethoden.
Fuer das Marschallen und Unmarschallen muss ich also noch extra Aufwand treiben, damit ich dem Schema entspreche (nach Marshall) bzw. die Fahrzeug-Liste gefuellt bekomme (nach Unmaraschall).
Wie schaffe ich es, dass je nach Fahrzeugtypen in der Liste das Wrapper-Element mal "Autos" und mal "Motorraeder" heisst mit JAXB-Mitteln ?
Ich hoffe das war jetzt nicht zu lang, um das Problem zu erklaeren
Vielen Dank schon mal fuer Tipps und Tricks im Voraus.