2010-10-28 2 views
2

Я пытаюсь создать что-то подобное с JAXB:Mapping Java коллекции, содержит супер- и подтипы с JAXB

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

Дочерние элементы <identities> все стволовые от общего супер-класса.

В Java это так:

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

Где Identity супер класс для Blue, Green и некоторых других.

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 {} 

Как правильно аннотировать классы, чтобы получить то, что мне нужно? В настоящее время выход примерно так:

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

ответ

1

Просто измените свой пример, чтобы использовать @XmlElementRef аннотацию на свойстве идентичностей.

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

Strike! Спасибо, сегодня я чему-то научился. –

Смежные вопросы