Frage

Ich Belichten eines Web-Service mit CXF. Ich bin der @XmlID und @XmlIDREF JAXB Annotationen verwenden während Rangier / unmarshalling referentielle Integrität meines Objektgraphen zu erhalten.

Die WSDL-Recht enthält Elemente mit der xs: id und xs: idref führt dies zu vertreten

.

Auf der Serverseite, funktioniert alles wirklich schön. Instanzen von Typen kommentierten mit @XmlIDREF sind die gleichen Instanzen (wie in ==) die mit der @XmlID Anmerkung kommentiert.

Allerdings, wenn ich einen Client mit WSDLToJava, die Referenzen erzeugen (die mit @XmlIDREF kommentierten) sind vom Typ java.lang.Object.

Gibt es eine Möglichkeit, dass ich die JAXB Bindungen so anpassen können, dass die Arten von Referenzen sind entweder java.lang.String (die ID des referenzierten Typ entsprechen) oder die gleiche wie die referenzierte Typ selbst?

War es hilfreich?

Lösung 3

OK, so wird dies nicht funktionieren. Es ist nicht möglich, JAXB-Code mit den richtigen Typen für den IDREFs zu erzeugen, weil das Schema nicht die Typen von Referenzen angeben kann, und es kann IDREF die zeigen auf verschiedene komplexe Typen sein. Wie würden wissen JAXB, was die Typen der Referenzen sind? Eine Erweiterung auf XML-Schema würde es tun! :)

Andere Tipps

Mit den Inline-JAXB Bindungen des Typs, um anzuzeigen, zu verwenden. Dann JAXB generierten Code wird korrekten Typ haben.

<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>

Beachten Sie auch, dass Sie die jaxb Namespace und JAXB Version im schema Elemente zu erklären haben.

<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">

Die folgenden scheint zumindest auf String-Eigenschaften für die Elemente / Attribute des Typs xs zu erstellen: IDREF. Ein guter Start, aber idealerweise JAXB würde Eigenschaften des gleichen Typs erzeugen, wenn das Element verwiesen wird. Ich werde berichten, ob / wann ich herausfinden, wie das zu tun. Dieses Ergebnis kann darauf hindeuten, dass ich meinen eigenen Konverter zu schreiben, was schade wäre.

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top