when does JAXB unmarshaller.unmarshal returns a JAXBElement<MySchemaObject> or a MySchemaObject?

java, jaxb, unmarshalling

Solution

If the root element uniquely corresponds to a Java class then an instance of that class will be returned, and if not a `JAXBElement` will be returned.

If you want to ensure that you always get an instance of the domain object you can leverage the `JAXBInstrospector`. Below is an example.

Demo

package forum10243679;

import java.io.StringReader;
import javax.xml.bind.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    private static final String XML = "<root/>";

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        JAXBIntrospector jaxbIntrospector = jc.createJAXBIntrospector();

        Object object = unmarshaller.unmarshal(new StringReader(XML));
        System.out.println(object.getClass());
        System.out.println(jaxbIntrospector.getValue(object).getClass());

        Object jaxbElement = unmarshaller.unmarshal(new StreamSource(new StringReader(XML)), Root.class);
        System.out.println(jaxbElement.getClass());
        System.out.println(jaxbIntrospector.getValue(jaxbElement).getClass());
    }

}

Output

class forum10243679.Root
class forum10243679.Root
class javax.xml.bind.JAXBElement
class forum10243679.Root

Problem

I have two codes, in two different java projects, doing almost the same thing, (unmarshalling the input of a webservice according to an xsd-file). But in one case I should write this: (Input is a placeholder name) ( element is OMElement input ) ``` ClassLoader clInput = input.ObjectFactory.class.getClassLoader(); JAXBContext jc = JAXBContext.newInstance("input", clInput); Unmarshaller unmarshaller = jc.createUnmarshaller(); Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() ); ``` and in the other lib I must use JAXBElement.getValue(), because it is a JAXBElement that is returned, and a simple (Input) cast simply crashes: ``` Input input = (Input)unmarshaller.unmarshal( element.getXMLStreamReader() ).getValue(); ``` Do you know what leads to such a difference ?

Original source

Related problems