aggiornamento - vedi Modifica nella parte inferioreJAXB annotazioni - come faccio a fare una lista di elementi XmlIDRef hanno il valore id come attributo al posto del testo elemento del corpo?
IDREFS/keyrefs sembrano essere possibile in annotazioni JAXB, ma l'arbitro finisce per essere il testo elemento.
desidero l'arbitro di essere un attributo di un elemento.
Ad esempio, dato questo modello oggetto:
@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;
}
Vorrei il formato XML esteriorizzata per finire per assomigliare a questo:
<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>
Invece, il meglio che posso fare è questo (con le annotazioni di cui sopra nel codice Java):
<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>
c'è un modo per forzare l'idref valore per essere un attributo del dipendente, piuttosto che il corpo del testo dell'elemento? So che posso farlo con uno schema XML, ma mi piacerebbe attenermi alle annotazioni, se possibile.
Grazie.
Modifica La soluzione di Torious in basso funziona quasi, ma non funziona in alcune circostanze.
unmarshalling ha esito negativo se gli elementi "uffici" vengono prima (nel file XML) gli elementi "dipendenti" che i riferimenti d'ufficio. I riferimenti dipendenti non vengono trovati e il wrapper EmployeeRef ha un oggetto dipendente null. Se il "dipendente" è il primo, funziona.
Questo non sarebbe un gran problema, ma il metodo di marshalling metterà gli "uffici" al primo posto, in modo che il tentativo di non riconoscere ciò che è stato appena scartato fallisca.
modifica 2 commento in risposta di Torious risolve il problema dell'ordine.
sì, questo ha fatto il trucco. Grazie. – marathon
ok, questo non funziona abbastanza in alcune (più) circostanze. Vedi modifica sopra – marathon
Annota la classe 'Company' con' @XmlType (propOrder = {"dipendenti", "uffici"}) 'per forzare l'ordine desiderato durante il marshalling. – Torious