Update - siehe Bearbeiten am unteren RandJAXB-Annotationen - Wie mache ich eine Liste von XmlIDRef-Elementen mit dem ID-Wert als Attribut anstelle von Elementtext?
IDREFS/keyrefs scheint in JAXB Annotationen möglich zu sein, aber der Schiedsrichter endet als Element Text oben.
Ich möchte, dass der Verweis ein Attribut eines Elements ist.
Zum Beispiel gegeben dieses Objektmodell:
@XmlType
public class Employee {
@XmlID
@XmlAttribute
String name;
@XmlAttribute
int years;
@XmlAttribute
String foo;
}
@XmlType
public class Office {
@XmlAttribute
String name;
@XmlElementWrapper
@XmlElement(name = "employee")
List<Employee> employees;
}
@XmlRootElement
public class Company {
@XmlElementWrapper
@XmlElement(name = "office")
List<Office> offices;
@XmlElementWrapper
@XmlElement(name = "employee")
List<Employee> employees;
}
Ich würde das externalisierte XML-Format wie wie diese am Ende aussehen:
<company>
<offices>
<office name="nyc">
<employees>
<!--*** id ref to employee name ***-->
<employee ref="alice"/>
<employee ref="bob"/>
</employees>
</office>
<office name="sf">
<employees>
<employee ref="connie"/>
<employee ref="daphne"/>
</employees>
</office>
</offices>
<employees>
<!-- *** name is the id *** -->
<employee name="alice" years="3" foo="bar"/>
<employee name="bob" years="3" foo="bar"/>
<employee name="connie" years="3" foo="bar"/>
<employee name="daphne" years="3" foo="bar"/>
</employees>
</company>
Stattdessen das Beste, was ich tun kann, ist dies (mit den Anmerkungen oben in dem Java-Code aufgeführt):
<company>
<offices>
<office name="nyc">
<employees>
<employee>alice</employee>
<employee>bob</employee>
</employees>
</office>
<office name="sf">
<employees>
<employee>connie</employee>
<employee>daphne</employee>
</employees>
</office>
</offices>
<employees>
<employee name="alice" years="3" foo="bar"/>
<employee name="bob" years="3" foo="bar"/>
<employee name="connie" years="3" foo="bar"/>
<employee name="daphne" years="3" foo="bar"/>
</employees>
</company>
gibt es eine Möglichkeit ich die idref zwingen kann, Wert als Attribut des Mitarbeiters und nicht als Elementtext? Ich weiß, dass ich dies mit einem XML-Schema tun kann, aber ich möchte gerne Anmerkungen machen, wenn es überhaupt möglich ist.
Vielen Dank.
Bearbeiten Die Lösung von Torious unten funktioniert fast, aber es funktioniert nicht ganz unter bestimmten Umständen.
unmarshalling schlägt fehl, wenn die "offices" -Elemente (in der XML-Datei) die "employee" -Elemente enthalten, auf die das Office verweist. Die Mitarbeiterreferenzen werden nicht gefunden, und der EmployeeRef-Wrapper hat ein Null-Mitarbeiterobjekt. Wenn der "Angestellte" zuerst ist, funktioniert es.
Dies wäre nicht so ein Problem, aber die Marshal-Methode wird "Büros" zuerst, so dass der Versuch, zu entpacken, was gerade gerüstet wurde fehlschlägt.
Bearbeiten 2 Kommentar in Torious 'Antwort löst das Bestellproblem.
yup, das hat den Trick gemacht. Vielen Dank. – marathon
ok, das funktioniert unter einigen (meisten) Umständen nicht ganz. Siehe Bearbeiten über – marathon
. Kommentieren Sie die 'Company' Klasse mit' @XmlType (propOrder = {"employees", "offices"}) ', um die gewünschte Reihenfolge beim Marshalling zu erzwingen. – Torious