JAXB - Немаршаллизирующие полиморфные объекты - PullRequest
5 голосов
/ 31 марта 2011

Мне дан XML, который выглядит (конечно, с большим количеством атрибутов):

<inventory>
  <item kind="GRILL" tag=123 brand="WEBER"/>
  <item kind="CAR" tag=124 make="FORD" model="EXPLORER" />
</inventory>

примерно с дюжиной различных типов.Я использую аннотации для сопоставления с классами Java, которые выглядят следующим образом:

@XmlRootElement(name="inventory")
public class Inventory {
  @XmlElement(name="item")
  public List<Item> itemList = new LinkedList<Item>;
}
abstract public class Item {
  @XmlAttribute public int tag;
}
public class Grill extends Item {
  @XmlAttribute public string brand;
}
public class Car extends Item {
  @XmlAttribute public string make;
  @XmlAttribute public string model;
}

Как я могу получить JAXB для создания субклассовых объектов Item на основе поля "kind"?

1 Ответ

4 голосов
/ 31 марта 2011

Есть несколько разных подходов:

JAXB (JSR-222)

Следующий подход должен работать с любой реализацией JAXB (Metro, MOXy, JaxMe,так далее).Используйте XmlAdapter, где адаптированный объект содержит свойства родительского класса и всех подклассов.В XmlAdapter добавьте логику того, когда следует использовать определенный подкласс.Для примера см. Ссылку на аналогичный вопрос ниже:

EclipseLink JAXB (MOXy)

Вы можете использовать расширение @XmlDescriminatorNode в EclipseLink JAXB (MOXy) для обработки этого варианта использования.

Проверьте мой ответ на похожий вопрос:

Мы улучшили эту поддержку в выпуске EclipseLink 2.2:

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