2010-10-28 17 views
2

Je suis en train de produire quelque chose comme ça avec JAXB:cartographie des collections Java qui contient super- et sous-types avec JAXB

<person> 
    <firstName>Foo</firstName> 
    <lastName>Bar</lastName> 
    <identities> 
     <green id="greenId"> 
      <some_elements.... 
     </green> 
     <blue id="blueId"/> 
    </identities> 

Les éléments enfants de <identities> tous les souches d'une super-classe commune.

En Java, il est comme ceci:

@XmlRootElement(name = "person") 
public class Person { 
    public String firstName; 
    public String lastName; 
    @XmlElementWrapper(name = "identities") 
    public Set<Identity> identities = new HashSet<Identity>(); 
} 

Identity est une super classe pour Blue, Green et quelques autres.

public class Identity { 
    @XmlID 
    @XmlAttribute 
    public String id; 
} 

@XmlRootElement(name = "blue") 
public class Blue extends Identity { 
    public String oneOfManyFields; 
} 

@XmlRootElement(name = "green") 
public class Green extends Identity {} 

Comment annoter correctement les classes pour obtenir ce dont j'ai besoin? Actuellement, la sortie est comme ceci:

<identities> 
    <identities id="0815"/> 
</identities> 

Répondre

1

Modifiez simplement votre exemple pour utiliser l'annotation @XmlElementRef sur la propriété identities.

import java.util.HashSet; 
import java.util.Set; 

import javax.xml.bind.annotation.XmlElementRef; 
import javax.xml.bind.annotation.XmlElementWrapper; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name = "person") 
public class Person { 
    public String firstName; 
    public String lastName; 
    @XmlElementWrapper(name = "identities") 
    @XmlElementRef 
    public Set<Identity> identities = new HashSet<Identity>(); 
} 
+0

Frappe! Merci, j'ai appris quelque chose aujourd'hui. –