Annotazioni XAXID e XmlIDREF JAXB (da schema a Java)
Domanda
Sto esponendo un servizio web usando CXF. Sto usando le annotazioni JAXB @XmlID e @XmlIDREF per mantenere l'integrità referenziale del mio grafico oggetto durante il marshalling / unmarshalling.
WSDL contiene giustamente elementi con gli attributi xs: id e xs: idref per rappresentarlo.
Sul lato server, tutto funziona davvero bene. Le istanze di tipi annotate con @XmlIDREF sono le stesse istanze (come in ==) di quelle annotate con l'annotazione @XmlID.
Tuttavia, quando generi un client con WSDLToJava, i riferimenti (quelli annotati con @XmlIDREF) sono di tipo java.lang.Object.
Esiste un modo per personalizzare i collegamenti JAXB in modo tale che i tipi di riferimenti siano java.lang.String (per abbinare l'ID del tipo di riferimento) o lo stesso del tipo di riferimento stesso?
Soluzione 3
OK, quindi non funzionerà. JAXB non è in grado di generare codice con i tipi corretti per gli IDREF poiché lo schema non può specificare i tipi di riferimenti e potrebbero esserci IDREF che puntano a tipi complessi diversi. In che modo JAXB potrebbe sapere quali sono i tipi di riferimenti? Un'estensione allo schema XML lo farebbe! :)
Altri suggerimenti
Utilizzare i collegamenti JAXB in linea per indicare il tipo da utilizzare. Quindi il codice generato da JAXB avrà il tipo corretto.
<complexType name="Column">
<sequence>
<element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
<element name="referencedColumn" type="IDREF" maxOccurs="1" minOccurs="0">
<annotation>
<appinfo>
<jaxb:property>
<jaxb:baseType name="Column"/>
</jaxb:property>
</appinfo>
</annotation>
</element>
</sequence>
<attribute name="id" type="ID" use="required"></attribute>
</complexType>
Si noti inoltre che è necessario dichiarare lo spazio dei nomi jaxb
e la versione JAXB nell'elemento schema
.
<schema targetNamespace="http://example.com/schema"
elementFormDefault="qualified"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="1.0">
Sembra che quanto segue crei almeno le proprietà di stringa per gli elementi / attributi di tipo xs: IDREF. Un buon inizio, ma idealmente JAXB genererebbe proprietà dello stesso tipo dell'elemento a cui si fa riferimento. Riporterò indietro se / quando scoprirò come farlo. Questo risultato potrebbe indicare che devo scrivere i miei convertitori, il che sarebbe un peccato.
<jxb:bindings version="2.0" xmlns:jxb="http://java.sun.com/xml/ns/jaxb" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jxb:globalBindings>
<jxb:javaType name="java.lang.String" xmlType="xs:IDREF" parseMethod="javax.xml.bind.DatatypeConverter.parseString" printMethod="javax.xml.bind.DatatypeConverter.printString" />
</jxb:globalBindings>
</jxb:bindings>