2011-09-07 13 views
9

Estoy intentando Resolver referencia el siguiente código XML utilizando JAXB:Tratar con JAXB Colecciones

<Works> 
    <Work> 
     <Composers> 
      <Composer> 
       <Name>A name</Name> 
      </Composer> 
      <Composer> 
       <Name>A name 2</Name> 
      </Composer> 
     </Composers> 
    </Work> 
</Works> 

He generado todas las clases utilizando XJC. Si quiero acceder a la colección Compositores, tengo que hacer esto:

List<Composer> composers = work.getComposers().getComposer(); 

¿Hay alguna manera de que pueda hacer lo siguiente en su lugar?

List<Composer> composers = work.getComposers(); 

aprecio la necesidad de un objeto Compositores, ya que deriva del XML, pero cuando se trata en Java, que tiene un POJO intermedia que almacena las colecciones parece un poco redundante.

Mi XSD es:

<xsd:complexType name="Works"> 
    <xsd:sequence> 
     <xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Work"> 
    <xsd:sequence> 
     <xsd:element name="Composers" type="Composers"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composers"> 
    <xsd:sequence> 
     <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composer"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

+0

¿Tiene un esquema que utilizó para generar los POJO? –

+0

List composers = work.getComposers(). GetComposer(); esto no se ve bien Debería devolverte solo un compositor, no una lista de compositores. Mientras que List composers = work.getComposers(); esto parece correcto. –

+0

He agregado mi esquema XSD – seedhead

Respuesta

6

El plugin @XmlElementWrapper hace exactamente lo que quiere.

+1

¡Gracias William! Lamentablemente, este complemento no es compatible con JAXB 2.1, solo 2.0. ¿La única opción aquí es degradar a 2.0? – seedhead

+0

Lo estoy usando en un proyecto con JAXB 2.2.3 sin ningún problema. ¿Puedes decirme qué error estás viendo? –

+0

Ningún error, pero las clases generadas de XJC no contienen las anotaciones @XmlElementWrapper esperadas. Estoy usando Java 6 y JAXB 2.1, ¿estás usando Java 6 también? – seedhead

2

Para cualquiera que no pueda o no quiera usar el complemento: Si puede vivir con una estructura XML diferente, es posible evitar generar las clases de envoltura adicional simplemente usando maxoccurs="unbounded" y omitiendo el elemento contenedor. Usando el ejemplo original:

<xsd:element name="Work" type="Work" maxOccurs="unbounded" minOccurs="0"/> 

<xsd:complexType name="Work"> 
    <xsd:sequence> 
     <xsd:element name="Composer" type="Composer" maxOccurs="unbounded" minOccurs="0"/> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="Composer"> 
    <xsd:sequence> 
     <xsd:element name="Name" type="xsd:string"></xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

producirá una estructura como esta:

<Work> 
    <Composer> 
     <Name>A name</Name> 
    </Composer> 
    <Composer> 
     <Name>A name 2</Name> 
    </Composer> 
</Work> 

Esto pondrá un método del tipo de trabajo que devuelve un objeto List<Composer>. Lamentablemente, el método se llama getComposer en lugar de getComposers, pero puede usar annotations or custom bindings para solucionar ese problema.

Cuestiones relacionadas