NOTE: This article is 3 years or older so its information may no longer be relevant. Read on at your own discretion! Comments for this article have automatically been locked, refer to the FAQ
for more details.
I've recently had a requirement to unmarshal an XML
fragment that was passed into one of my services. This in itself is typically not and issue and I've written code that does that plenty a time, however in this case I was having to unmarshal a fragment for a complex type
, not for an element
. That's where it got a little bit more complicated.
Initially my code was throwing the following exception:
So that meant that the unmarshaller didn't recognise any valid elements in my XML
string that I was trying to unmarshal. I checked the JAXB Context
and it definitely had the complex type I was after so it was something else I was doing wrong.
Lets take a step back and look at the schema, my complex type, MyComplexType
, was defined as:
That resulted in a JAXB generated class
that looked like:
So, no XmlRootElement
annotation. That's because it was a complex type
and not an element
of that type. That should have been obvious right away, but I missed it initially. Luckily there was a simple way around it. All I had to do was tell JAXB
what complex type I was expecting and wrap the XML fragment
as a Source
or specifically StreamSource
So the code that would achieve that looked something like...
That worked like a charm and I could then get my unmarshalled complex type instance from the JAXBElement
A quick disclaimer...
Although I put in a great effort into researching all the topics I cover, mistakes can happen.
If you spot something out of place, please do let me know.
All content and opinions expressed on this Blog are my own and do not represent the opinions of my employer (Oracle).
Use of any information contained in this blog post/article is subject to this disclaimer
Other posts you may like...