Jaxb объекты с тем же именем - PullRequest
6 голосов
/ 20 января 2012

Казалось бы, можно разархивировать два разных 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, аналогичного следующему

<bars>
  <bar>
    <val>1</val>
  </bar>
  <bar>
    <val>1</val>
    <type>2</type>
  </bar>
</bars>

Список заключен в класс с использованием @XmlAnyElement

@XmlRootElement
public class Bars {

  @XmlMixed
  @XmlAnyElement(lax = true) 
  @XmlElementRefs({@XmlElementRef(BarA.class), @XmlElementRef(BarB.class)})
  private List<Bar> 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, разные типы, но с одинаковым именем? обязательно будет единственнымподходить либо.

Ответы [ 2 ]

2 голосов
/ 20 января 2012

Вы можете использовать XmlAdapter для этого.Ниже приведены ответы, которые я дал на похожий вопрос:

2 голосов
/ 20 января 2012

Действительно, первое, что я бы попытался сделать, это устранить источник проблемы - наличие двух разных классов JAXB с одинаковым именем.Подобная ситуация неизбежно вызовет головные боли у вас и у людей, которые должны поддерживать ваш код.

Если это невозможно ... Может быть, вы могли бы написать другой подкласс под названием EveryBar и всегда разоблачать это.EveryBar будет содержать все поля каждого другого подкласса Bar.Затем у вас будет шаг постобработки в дереве объектов, который будет проверять EveryBar и заменять его на экземпляр любого типа, который подходит.Да, это уродливое решение, но оно лишь немного хуже, чем по вашей ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...