Казалось бы, можно демаршалировать два разных jaxb
объектов с одинаковым именем .
Существует класс Bar
...
public abstract Bar {
private @XmlElement String val;
}
.. с двумя реализациями (не учитываются конструкторы и т. Д.):
@XmlRootElement(name="bar")
public class BarA extends Bar { }
@XmlRootElement(name="bar")
public class BarB extends Bar {
private @XmlElement(required=true) String type;
}
Наконец, я хочу демаршалировать список Bar
документы из XML, подобные следующему
1
1
2
Список заключен в класс, использующий @XmlAnyElement
@XmlRootElement
public class Bars {
@XmlMixed
@XmlAnyElement(lax = true)
@XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)})
private List bars;
}
Однако мне кажется, что только получают экземпляры либо BarA
или BarB
, в зависимости от того, какой элемент последний в цепочке @XmlElementRefs
.
Код тестирования:
String xml = ...
JAXBContext jc = JAXBContext.newInstance(Bars.class);
ByteArrayInputStream in = new ByteArrayInputStream(xml.getBytes());
Bars bars = (Bars) jc.createUnmarshaller().unmarshal(in);
for (Bar bar : bars.getBars()) {
System.out.println(bar.getClass());
}
Я не думаю, что XmlAdapter
, предложенный в JAXB @XmlElements, разные типы, но с одинаковым именем? , также обязательно будет единственным подходом.