Объекты Jaxb с одинаковым именем

Казалось бы, можно демаршалировать два разных 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, разные типы, но с одинаковым именем? , также обязательно будет единственным подходом.

6
задан Community 23 May 2017 в 12:16
поделиться