JAXB маршаллер для маршала суперкласса в качестве корневого элемента и использования xsi: type - PullRequest
0 голосов
/ 08 июня 2011

Я пытаюсь маршалировать подкласс как суперкласс с помощью информации xsi: type в качестве атрибутов корневого элемента XML.

В настоящее время это то, что у меня есть (скажем, ..):

  • XMLDOCUMENTTYPE является суперклассом XMLINVOICETYPE
  • маршалинг XMLINVOICETYPE даст мне <xmlInvoiceType>
  • приведение экземпляра XMLINVOICETYPE к экземпляру XMLDOCUMENTTYPE, а затем маршалинг 101 все равно даст мне **
  • Создание объекта-оболочки, аннотированного JAXB-аннотацией, похоже, помогает, но теперь мне нужно захватить первый дочерний узел

, например:

jaxbWrapper.setXmlDocumentType(xmlInvoiceTypeInstance);

// выполнит трюк, но дополнительный root

Я хотел бы получить следующее:

<XMLDOCUMENTTYPE ... ... xsi:type="XML_INVOICE_TYPE">
</XMLDOCUMENTTYPE>

Есть идеи, как это сделать?

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Попробуйте маршаллинг:

new JAXBElement(new QName("XMLDOCUMENTTYPE"), XMLDOCUMENTTYPE.class, xmlInfoiceTypeInstance)
0 голосов
/ 14 января 2015

xsi: тип отображается только в том случае, если тип не соответствует классу.

Попробуйте:

// create the type and add childs and attributes ...
XmlInVoiceType xmlInVoice = new XmlInVoiceType();
// map the element to object to force xsi:type 
final JAXBElement<?> object = new JAXBElement<>(new QName("http://your/namespace/xmlinvoice", "xmlinvoice"), Object.class, xmlInVoice);
...