2011-02-02 16 views
14

Ho bisogno di un piccolo aiuto con Annotazioni JAXB e non sono riuscito a trovare un buon documento che mi aiuti a capirlo.JAXB Annotations

Ho una classe che desidero effettuare il marshalling in XML. La mia classe è simile al seguente:

@XmlRootElement(name="car") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
    "vid", 
    "make", 
    "model", 
    "recalls", 
    "engSpec" 
}) 

public class Car { 
    @XmlElement(name="vid", required=true) 
    private String vid; 
    @XmlElement(name="make", required=true) 
    private String make; 
    @XmlElement(name="model", required=true) 
    private String model; 
    @XmlElement(name="recalls", required=true) 
    private ArrayList<Recall> recalls; 
    @XmlElement(name="engSpec", required=true) 
    private EngSpec engSpec; 
... 

E la classe di richiamo si presenta così:

@XmlRootElement(name = "recall") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(propOrder = { 
     "type", 
     "date" 
}) 
public class Recall { 
    @XmlElement(name="type", required=true) 
    private String type; 
    @XmlElement(name="date", required=true) 
    private String date; 
... 

Quindi produce questo output XML:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
</recalls> 
<recalls> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

Ma quello che voglio ArrayList per visualizzare in modo diverso, come questo:

<car> 
<vid>vid</vid> 
<make>make</make> 
<model>model</model> 

<recalls> 
    <recall> 
    <type>Recall1</type> 
    <date>01/01/11</date> 
    </recall> 
    <recall> 
    <type>Recall2</type> 
    <date>01/01/11</date> 
    </recall> 
</recalls> 

<engSpec> 
    <power>200HP</power> 
    <size>size</size> 
</engSpec> 
</car> 

Qualche idea su come posso fare questo? Credo che il problema è con il mio schema, ma io uso questo per lo smistamento:

JAXBContext jc = JAXBContext.newInstance(Car.class); 
Marshaller marsh = jc.createMarshaller(); 
marsh.marshal(car, out); 

Delle idee come risolvere questo problema? Grazie!

+5

A proposito, se il nome della proprietà del bean è lo stesso dell'elemento XML, non è necessario specificare l'annotazione '@ XmlElement' ... risparmiando tutta la digitazione. :) – limc

risposta

31

Prova questo:

@XmlRootElement(name="car") 
... 
public class Car { 
    ... 

    @XmlElementWrapper(name="recalls") // this name=... can be omitted, as it 
             // is the same as the field name 
    @XmlElement(name="recall") 
    private ArrayList<Recall> recalls; 
} 

Dal documentation:

XmlElementWrapper: Genera un elemento wrapper rappresentazione XML. Questo è principalmente inteso per essere utilizzato per produrre un elemento XML wrapper attorno alle collezioni.

+1

Fantastico, questo ha funzionato alla grande! Grazie! –