Bitte beachten Sie das folgende Beispiel wird eine Klasse erweitert:JAXB: Problem eine Klasse B Deserialisieren, die mit A
Es gibt einen KlasseA und einen ClassB die es erstreckt. Mein Problem ist jetzt, dass ich eine ClassB von einer xml-Datei entfernen muss. Bitte beachten Sie, dass ClassA nicht geändert werden kann, da es nicht unter meiner Kontrolle steht.
Mehrere Probleme sind in diesem Beispiel festgestellt:
Das Hauptproblem ist, dass KlasseA keinen Standard hat kein argument Konstruktor, die von JAXB ohne Adapter erforderlich ist. Daher implementierte ich MyAdapter, die ClassB auf die einfache Klasse ValB abbildet, die von JAXB ohne Probleme verarbeitet werden kann.
Das Hauptproblem ist, wie man JAXB diesen Adapter benutzen lässt? Weder die Definition des @XmlJavaTypeAdapter auf Klassenebene noch die Registrierung des Adapters beim Unmarshaller machen es.
Weiß jemand, wie JAXB MyAdapter, so dass die Unmarshaller gibt ein Objekt, das ist eine Instanz KlasseA verwenden zu machen?
public class JaxbTest {
public static abstract class ClassA {
public ClassA(String id) {
}
}
@XmlRootElement
@XmlJavaTypeAdapter(MyAdapter.class) // does not have an effect
public static class ClassB extends ClassA {
public String text;
public ClassB() {
super("");
}
}
public static class ValB {
public String text;
}
public static class MyAdapter extends XmlAdapter<ValB, ClassB> {
@Override
public ClassB unmarshal(ValB v) throws Exception {
ClassB b = new ClassB();
b.text = v.text;
return b;
}
@Override
public ValB marshal(ClassB v) throws Exception {
ValB b = new ValB();
b.text = v.text;
return b;
}
}
public static void main(String[] args) {
try {
JAXBContext context = JAXBContext.newInstance(ClassB.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setAdapter(new MyAdapter()); // does not have an effect
ClassA a = (ClassA) unmarshaller.unmarshal(new File("test.xml"));
// do somthing with a
} catch (Exception e) {
e.printStackTrace();
}
}
}
BTW: Nehmen Sie den Code nicht zu ernst - es ist nur ein Beispiel für das Problem. Ich weiß, dass die Definition von ClassA und ClassB nicht wirklich nützlich sind.
Wir haben dieses Problem in t angesprochen er kommenden EclipseLink JAXB (MOXy) Release. In dieser Version sind keine Codeänderungen in Ihrem Beispiel erforderlich: http://stackoverflow.com/questions/4459737/jaxb-problem-deserializing-a-class-b-that-extends-a-class-a/4459779#4459779 –