В случае, если кто-либо из вас хочет написать оболочку списка для списков, содержащих элементы нескольких классов, и хотите дать отдельное имя XmlElement в соответствии с типом класса без написания классов X Wrapper, вы можете использовать аннотацию @XmlMixed
.
При этом JAXB называет элементы списка в соответствии со значением, установленным @XmlRootElement
.
При этом вы должны указать, какие классы могут быть в списке, используя @XmlSeeAlso
Пример:
Возможные классы в списке
@XmlRootElement(name="user")
public class User {/*...*/}
@XmlRootElement(name="entry")
public class LogEntry {/*...*/}
Класс обертки
@XmlRootElement(name="records")
@XmlSeeAlso({User.class, LogEntry.class})
public static class JaxbList<T>{
protected List<T> records;
public JaxbList(){}
public JaxbList(List<T> list){
this.records=list;
}
@XmlMixed
public List<T> getRecords(){
return records;
}
}
Пример:
List l = new List();
l.add(new User("userA"));
l.add(new LogEntry(new UserB()));
XStream xStream = new XStream();
String result = xStream.toXML(l);
Результат:
<records>
<user>...</user>
<entry>...</entry>
</records>
В качестве альтернативы вы можете указать имена XmlElement непосредственно внутри класса оболочки, используя аннотацию @XmlElementRef
@XmlRootElement(name="records")
@XmlSeeAlso({User.class, LogEntry.class})
public static class JaxbList<T>{
protected List<T> records;
public JaxbList(){}
public JaxbList(List<T> list){
this.records=list;
}
@XmlElementRefs({
@XmlElementRef(name="item", type=Object.class),
@XmlElementRef(name="user", type=User.class),
@XmlElementRef(name="entry", type=LogEntry.class)
})
public List<T> getRecords(){
return records;
}
}