2012-09-24 9 views
6

Abbiamo uno schema XSD con una dichiarazione come questa:xsd: elenco di tipo personalizzato è generato nella Lista <String>

<xsd:simpleType name="customId"> 
    <xsd:annotation> 
     <xsd:appinfo> 
      <jaxb:javaType name="com.company.identifiers.CustomId" parseMethod="fromString" printMethod="toString"/> 
     </xsd:appinfo> 
    </xsd:annotation> 
    <xsd:restriction base="xsd:int" /> 
</xsd:simpleType> 

Poi, voglio avere un elenco di questo tipo in una classe Java generato:

<xsd:complexType name="SomeMessage"> 
    ... 
<xsd:attribute name="customIds" use="optional"> 
     <xsd:simpleType> 
      <xsd:list itemType="customId" /> 
     </xsd:simpleType> 
</xsd:attribute> 
    ... 
</xsd:complexType> 

Ma il campo customIds, per qualche ragione, è generato come List<String>.

immagino, xsd:sequence potrebbe essere usato al posto di xsd:list, ma SomeMessage ha già un xsd:choice, e per quanto ho capito, è illegale avere xsd:sequence nella stessa dichiarazione.

Grazie!

risposta

3

Codice generato utilizzando NetBeans 7.1.2, in esecuzione su Java 1.7.0_02.

Se si desidera mappare semplici tipi di classi Java, un modo per farlo è di livello mondiale impostare mapSimpleTypeDef="true"

<xsd:annotation> 
    <xsd:appinfo> 
     <jaxb:globalBindings mapSimpleTypeDef="true"/> 
    </xsd:appinfo> 
</xsd:annotation> 

codice generato:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "SomeMessage") 
public class SomeMessage { 

    @XmlAttribute(name = "customIds") 
    protected List<CustomId> customIds; 

    /** 
    * Gets the value of the customIds property. 
    * 
    * <p> 
    * Objects of the following type(s) are allowed in the list 
    * {@link CustomId } 
    * 
    * 
    */ 
    public List<CustomId> getCustomIds() { 
     if (customIds == null) { 
      customIds = new ArrayList<CustomId>(); 
     } 
     return this.customIds; 
    } 

} 

Se si vuole fare riferimento il vostro pre-esistente Classe CustomId, quindi il seguente funziona nel mio caso:

<xsd:simpleType name="customId"> 
    <xsd:restriction base="xsd:int"/> 
</xsd:simpleType> 
<xsd:complexType name="SomeMessage"> 
    <xsd:attribute name="customIds" use="optional"> 
     <xsd:simpleType> 
      <xsd:annotation> 
       <xsd:appinfo> 
        <jaxb:javaType name="java.util.List&lt;com.company.identifiers.CustomId>" parseMethod="Class1.fromString" printMethod="Class1.toString"/> 
       </xsd:appinfo> 
      </xsd:annotation> 
      <xsd:list itemType="customId"/> 
     </xsd:simpleType> 
    </xsd:attribute> 
</xsd:complexType> 

Otterrete il foll causa:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "SomeMessage") 
public class SomeMessage { 

    @XmlAttribute(name = "customIds") 
    @XmlJavaTypeAdapter(Adapter1 .class) 
    protected List<CustomId> customIds; 

    /** 
    * Gets the value of the customIds property. 
    * 
    * @return 
    *  possible object is 
    *  {@link String } 
    *  
    */ 
    public List<CustomId> getCustomIds() { 
     return customIds; 
    } 

    /** 
    * Sets the value of the customIds property. 
    * 
    * @param value 
    *  allowed object is 
    *  {@link String } 
    *  
    */ 
    public void setCustomIds(List<CustomId> value) { 
     this.customIds = value; 
    } 

} 

E il generato adapter1:

public class Adapter1 
    extends XmlAdapter<String, List<CustomId>> 
{ 


    public List<CustomId> unmarshal(String value) { 
     return (Class1.fromString(value)); 
    } 

    public String marshal(List<CustomId> value) { 
     return (Class1.toString(value)); 
    } 

} 
+0

Grazie per la risposta! In realtà, sto cercando di non ottenere un 'Elenco ', ma un 'Elenco '. Sto usando JAXB 2.2. – gregvonbautt

+0

Per quanto riguarda 'xsd: sequence' e' xsd: choice', voglio dire quanto segue: ' ... ' Per questo tipo di dichiarazione, si dice che "la sequenza degli elementi" non è valida, è fuori posto o si verifica troppo spesso. ". – gregvonbautt

+0

Ho aggiornato per gestire i tuoi chiarimenti. Per avere una scelta e una sequenza, è necessario un wrapper di sequenza come questo: ... .... Gli attributi non possono essere inseriti all'interno di un gruppo di modelli (sequenza/scelta/tutti), vivono al di fuori di esso. Se si desidera utilizzare elementi anziché un attributo basato su una lista xsd :, si utilizzerà la sequenza nidificata nel mio esempio per implementarla. –

Problemi correlati