0

I'm trying to marshal a sub-class as super-class with xsi:type information as the XML Root element attributes.

Currently this is what I have (let's say..):

  • XMLDOCUMENTTYPE is a super class of XMLINVOICETYPE
  • marshalling XMLINVOICETYPE will give me <xmlInvoiceType>
  • Casting XMLINVOICETYPE instance to XMLDOCUMENTTYPE instance and then marshalling it would still give me <xmlInvoiceType>
  • Creating a wrapper object annotated with JAXB annotation seems to do the trick, but now I have to grab the first child-node

e.g.:

jaxbWrapper.setXmlDocumentType(xmlInvoiceTypeInstance);

// will do the trick but extra root

What I'd like to get is as follow:

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

Any idea how to do this?

lexicore
  • 42,748
  • 17
  • 132
  • 221
xandross
  • 911
  • 2
  • 11
  • 17

2 Answers2

2

Try marshalling:

new JAXBElement(new QName("XMLDOCUMENTTYPE"), XMLDOCUMENTTYPE.class, xmlInfoiceTypeInstance)
lexicore
  • 42,748
  • 17
  • 132
  • 221
0

xsi:type is only rendered, if the type does not match the class.

Try this:

// 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);
waffel
  • 51
  • 3