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?

È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top