I\'m trying to use JAXB to unmarshall some XML, but I\'m getting an \"Unable to create an instance of...\" exception. I understand why--it\'s trying to make an instance of
You could do the following:
@XmlRootElement
instead of the abstract classes.@XmlTransient
(see http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)@XmlElement(type=BarImpl.class)
on the bar
property to specify the concrete type (see http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html).JAXBTest
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElements;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.junit.Test;
public class JAXBTest {
@Test
public void test() throws javax.xml.bind.JAXBException {
String xml =
"" +
" " +
" qux " +
" " +
" ";
javax.xml.bind.JAXBContext context = javax.xml.bind.JAXBContext.newInstance(
FooImpl.class,
BarImpl.class
);
javax.xml.bind.Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.unmarshal(new java.io.StringReader(xml));
}
@XmlTransient
public static abstract class Foo {
@XmlElements({
@XmlElement(name="bar",type=BarImpl.class),
@XmlElement(name="bar",type=BarImpl2.class),
})
Bar bar;
}
@XmlTransient
public static abstract class Bar {
@XmlElement(name="baz")
String baz;
}
@XmlRootElement(name="foo")
public static class FooImpl extends Foo { }
@XmlRootElement(name="bar")
public static class BarImpl extends Bar { }
public static class BarImpl2 extends Bar { }
}