2012-09-24 42 views
6

Tenemos un esquema XSD con una declaración como esta:xsd: Se genera la lista de tipo personalizado en la 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> 

Entonces, yo quiero tener una lista de este tipo en una clase Java generado:

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

Pero el campo customIds, por alguna razón, se genera como List<String>.

supongo, xsd:sequence se puede utilizar en lugar de xsd:list, pero SomeMessage ya tiene un xsd:choice, y por lo que yo entiendo, es ilegal tener xsd:sequence en la misma declaración.

Gracias!

Respuesta

3

código generado usando NetBeans 7.1.2, que se ejecuta en Java 1.7.0_02.

Si desea asignar tipos simples a las clases de Java, una forma de hacerlo es a nivel mundial establecido mapSimpleTypeDef="true"

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

código generado:

@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; 
    } 

} 

Si se desea hacer referencia a su pre-existente Clase CustomId, a continuación, los siguientes trabajos en mi 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> 

Tendrá la siguiente debido:

@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; 
    } 

} 

Y el adapter1 generada:

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

Gracias por su respuesta! En realidad, estoy tratando de conseguir no es un '' Lista , sino una '' Lista . Estoy usando JAXB 2.2. En cuanto a – gregvonbautt

+0

'xsd: sequence' y' xsd: choice', quiero decir lo siguiente: ' ... ' Para este tipo de declaración, que dice " 'secuencia' elemento no es válido, fuera de lugar, o se produce muy a menudo".. – gregvonbautt

+0

He actualizado para hacer frente a sus aclaraciones. Para tener una elección y una secuencia, es necesario un envoltorio secuencia de este modo: ... .... Los atributos no se pueden colocar dentro de un grupo modelo (secuencia/elección/todo), viven fuera de él. Si desea utilizar elementos en lugar de un atributo basado en un xsd: lista, a continuación, se usaría la secuencia anidada en mi ejemplo para implementarlo. –

Cuestiones relacionadas