2010-07-02 3 views
2

J'ai donc lu sur l'utilisation des ID et IDREF dans JAXB here, et dans l'exemple présenté, ils utilisent 1 élément IDREF, qui apparaît comme un objet dans le Java généré code. J'inclus à la fois le schéma XML ...Incohérence JAXB entre 1 IDREF et plus de 1

<xsd:complexType name="CustomerType"> 
    <xsd:sequence> 
    <xsd:element name="id" type="xsd:ID"/> 
    <xsd:element name="name" type="xsd:string"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="OrderType"> 
    <xsd:sequence> 
    <xsd:choice> 
     <xsd:element name="customer" type="CustomerType"/> 
     <xsd:element name="custref" type="xsd:IDREF"/> 
    </xsd:choice> 
    <xsd:element name="items" type="ItemType" maxOccurs="unbounded"/> 
    </xsd:sequence> 
</xsd:complexType> 

et le code Java pour la postérité.

public class OrderType { 

    protected CustomerType customer; 
    protected Object custref; 
    protected List items; 

    public CustomerType getCustomer() { 
     return customer; 
    } 

    public void setCustomer(CustomerType value) { 
     this.customer = value; 
    } 

    public Object getCustref() { 
     return custref; 
    } 

    public void setCustref(Object value) { 
     this.custref = value; 
    } 

    public List getItems() { 
     if (items == null) { 
      items = new ArrayList(); 
     } 
     return this.items; 
    } 
} 

Maintenant, dans mon code, j'ai essayé quelque chose d'un peu différent, illustré par le schéma suivant:

<xsd:complexType name="SimViewType"> 
    <xsd:sequence> 
     <xsd:element name="NAME" type="xsd:string"></xsd:element> 
     <xsd:element name="ITEM" type="am:SimItemIDREF" minOccurs="0" maxOccurs="unbounded"></xsd:element> 
    </xsd:sequence> 
    <xsd:attribute name="id" type="xsd:ID" use="required"></xsd:attribute> 
</xsd:complexType> 

<xsd:simpleType name="SimItemIDREF"> 
    <xsd:restriction base="xsd:IDREF"></xsd:restriction> 
</xsd:simpleType> 

Bien que j'ai joint un IDREF général avec un SimItemIDREF, il est juste pour une meilleure lisibilité. Cependant, même si j'utilise un xsd normal: IDREF à la place, le simple fait que j'utiliser une valeur autre que 1 signifie que mon code Java se termine par ce qui suit ...

public class SimViewType { 
    ... 
    protected List<JAXBElement<Object>> item; 
    ... 
} 

Au lieu d'un List<Object>, je reçois un List<JAXElement<Object>>. Maintenant, si je veux faire un JAXElement, je peux le faire très bien, mais je ne peux pas l'ajouter à mon SimViewType car il n'y a pas de conversion entre JAXElement<SimItemType> et JAXElement<Object>. L'idée que SimViews ne conserve pas réellement le contrôle de SimItems est cruciale dans ma conception, donc la simple suppression de références n'est pas une bonne idée car cela peut créer des divergences dangereuses au moment de l'exécution.

Comment puis-je créer un SimItemType ou un JAXBElement de sorte que je puisse l'utiliser avec mon SimViewType?

+0

Comment avez-vous résoudre ce problème? Je suis confronté à un problème similaire - j'ai un élément déclaré avec 'type =" xs: IDREF "maxoccurs =" unbounded "' et annoté avec un type de base, et le type est déclaré correctement dans la classe Java, mais à l'exécution c'est une liste > à la place. – undefined

Répondre

0

XJC génère ObjectFactory avec la méthode createSimViewTypeITEM pour créer des éléments ITEM.

/** 
* Create an instance of {@link JAXBElement }{@code <}{@link Object }{@code >}} 
* 
*/ 
@XmlElementDecl(namespace = "", name = "ITEM", scope = SimViewType.class) 
@XmlIDREF 
public JAXBElement<Object> createSimViewTypeITEM(Object value) { 
    return new JAXBElement<Object>(_SimViewTypeITEM_QNAME, Object.class, SimViewType.class, value); 
} 

Cela aide-t-il?

0

Vous pouvez annotée votre schéma comme suit pour obtenir la classe souhaitée:

<xsd:schema 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns="http://www.mycompany.org/exchange" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    targetNamespace="http://www.mycompany.org/exchange" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" 
    jaxb:version="2.1"> 

    <xsd:complexType name="CustomerType"> 
     <xsd:sequence> 
      <xsd:element name="id" type="xsd:ID"/> 
      <xsd:element name="name" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 

    <xsd:complexType name="OrderType"> 
     <xsd:sequence> 
      <xsd:choice> 
       <xsd:element name="customer" type="CustomerType"/> 
       <xsd:element name="custref" type="xsd:IDREF"> 
        <xsd:annotation> 
         <xsd:appinfo> 
          <jaxb:property> 
           <jaxb:baseType name="org.mycompany.exchange.CustomerType"/> 
          </jaxb:property> 
         </xsd:appinfo> 
        </xsd:annotation> 
       </xsd:element> 
      </xsd:choice> 
      <!--xsd:element name="items" type="ItemType" maxOccurs="unbounded"/--> 
     </xsd:sequence> 
    </xsd:complexType> 

</xsd:schema> 

Ce qui suit est la classe résultante:

package org.mycompany.exchange; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlIDREF; 
import javax.xml.bind.annotation.XmlSchemaType; 
import javax.xml.bind.annotation.XmlType; 


@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "OrderType", propOrder = { 
    "customer", 
    "custref" 
}) 
public class OrderType { 

    protected org.mycompany.exchange.CustomerType customer; 
    @XmlElement(type = Object.class) 
    @XmlIDREF 
    @XmlSchemaType(name = "IDREF") 
    protected org.mycompany.exchange.CustomerType custref; 

    public org.mycompany.exchange.CustomerType getCustomer() { 
     return customer; 
    } 

    public void setCustomer(org.mycompany.exchange.CustomerType value) { 
     this.customer = value; 
    } 

    public org.mycompany.exchange.CustomerType getCustref() { 
     return custref; 
    } 

    public void setCustref(org.mycompany.exchange.CustomerType value) { 
     this.custref = value; 
    } 

} 
Questions connexes