JAXB und abstrakte Klassen
Ich versuche, JAXB zu unmarshall einige XML, aber ich bin immer ein "kann Nicht zum erstellen einer Instanz von..." - Ausnahme. Ich verstehe, warum-es ist Versuch, eine Instanz einer abstrakten Klasse. Was ich will, ist, es zu haben stellen Sie eine Instanz einer konkreten Implementierung der Klasse. Mein Ziel dabei ist, auf Klassen-spezifische Prüfungen auf setter-Methoden. Vielleicht "qux" ist eine gültige baz Wert für BarImpl, aber BarImpl2 will etwas anderes tun.
Bekam ich einen Teil des Weges es durch nicht kommentieren Foo, aber wenn ich unannotate bar, die Dinge hässlich.
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import org.junit.Test;
public class JAXBTest {
@Test
public void test() throws javax.xml.bind.JAXBException {
String xml =
"<foo>" +
" <bar>" +
" <baz>qux</baz>" +
" </bar>" +
"</foo>";
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));
}
@XmlRootElement(name="foo")
public static abstract class Foo {
@XmlElement(name="bar")
Bar bar;
}
@XmlRootElement(name="bar")
public static abstract class Bar {
@XmlElement(name="baz")
String baz;
}
public static class FooImpl extends Foo { }
public static class BarImpl extends Bar { }
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie das folgende tun:
@XmlRootElement
anstelle der abstrakten Klassen.@XmlTransient
(siehe http://blog.bdoughan.com/2011/06/ignoring-inheritance-with-xmltransient.html)@XmlElement(type=BarImpl.class)
auf diebar
- Eigenschaft geben Sie den konkreten Typ (siehe http://blog.bdoughan.com/2011/05/jaxb-and-interface-fronted-models.html).JAXBTest
@XmlElements
um dies zu umgehen, verwenden Fall.