2009-01-13 8 views
0

J'expose un service Web à l'aide de CXF. J'utilise les annotations @XmlID et @XmlIDREF JAXB pour maintenir l'intégrité référentielle de mon graphe d'objet pendant le marshalling/unmarshalling.Annotations JAXB XmlID et XmlIDREF (Schema to Java)

Le WSDL contient à juste titre des éléments avec les attributs xs: id et xs: idref pour le représenter. Du côté serveur, tout fonctionne très bien. Les instances de types annotés avec @XmlIDREF sont les mêmes instances (comme dans ==) que celles qui sont annotées avec l'annotation @XmlID.

Cependant, 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 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?

Répondre

0

OK, donc cela ne va pas fonctionner. Il n'est pas possible 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 sait quels sont les types de références? Une extension de XML Schema le ferait! :)

0

Les éléments suivants semblent 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 rapporterai si/quand je découvre comment faire cela. Ce résultat peut indiquer que j'ai besoin d'écrire mes propres convertisseurs ce qui serait une honte.

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

Utilisez les liaisons JAXB en ligne pour indiquer le type à utiliser. Alors le code généré par JAXB aura le 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 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">