Question

J'expose un service Web utilisant CXF. J'utilise les annotations @XmlID et @XmlIDREF JAXB pour maintenir l'intégrité référentielle de mon graphe d'objets lors du marshalling / unmarshalling.

Le WSDL contient à juste titre des éléments avec les attributs xs: id et xs: idref pour le représenter.

Du côté du serveur, tout fonctionne vraiment bien. Les instances de types annotées avec @XmlIDREF sont les mêmes (comme dans ==) que celles annotées avec l'annotation @XmlID.

Toutefois, lorsque je génère un client avec WSDLToJava, les références (celles annotées avec @XmlIDREF) sont de type java.lang.Object.

Est-il possible de personnaliser les liaisons JAXB de telle sorte que les types de références soient java.lang.String (pour correspondre à l'ID du type référencé) ou identiques au type référencé lui-même?

Était-ce utile?

La solution 3

OK, donc ça ne va pas marcher. Il est impossible pour JAXB de générer du code avec les types corrects pour les IDREF car le schéma ne peut pas spécifier les types de références et il peut y avoir des IDREF pointant vers différents types complexes. Comment JAXB saurait-il quels sont les types de références? Une extension à XML Schema le ferait! :)

Autres conseils

Utilisez les liaisons en ligne JAXB pour indiquer le type à utiliser. Le code généré par JAXB aura alors un type correct.

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

Notez également que vous devez déclarer l'espace de noms jaxb et la version de JAXB dans l'élément 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">

Ce qui suit semble au moins créer des propriétés de chaîne pour les éléments / attributs de type xs: IDREF. Un bon début, mais idéalement, JAXB générerait des propriétés du même type que l’élément référencé. Je ferai rapport si / quand je saurai comment faire cela. Ce résultat peut indiquer que je dois écrire mes propres convertisseurs, ce qui serait dommage.

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top