[英]JAXB: Problem deserializing a class B that extends a class A
請考慮以下示例:
有一個ClassA和一個ClassB擴展它。 我現在的問題是我必須從xml文件解組ClassB 。 請注意, ClassA不能更改,因為它不在我的控制之下。
在此示例中注意到幾個問題:
主要問題是ClassA沒有默認的no-arg構造函數,這是JAXB在沒有Adapter的情況下所需的。 因此,我實現MyAdapter它映射ClassB的到簡單的類值Valb其可以通過JAXB沒有任何問題地處理。
主要問題是如何讓JAXB使用這個適配器? 既不在類級別定義@XmlJavaTypeAdapter也不在unmarshaller中注冊適配器。
有沒有人知道如何使JAXB使用MyAdapter,以便unmarshaller返回一個ClassA實例的對象?
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();
}
}
}
順便說一句:不要把代碼太嚴肅 - 這只是一個證明問題的例子。 我知道ClassA和ClassB的定義並不真正有用。
UPDATE
我們在即將發布的EclipseLink JAXB(MOXy) 2.2.0版本中解決了這個問題(參見bug#332742 )。 在此版本中,不會檢查抽象類的無參數構造函數。
從12月18日開始,可以在此處獲得具有此修復程序的預發布版本:
解決方法
這就是@XmlTransient注釋的用途。 如果可能,請執行以下操作
@XmlTransient
public static abstract class ClassA {
public ClassA(String id) {
}
}
如果無法直接注釋ClassA,則可以利用EclipseLink JAXB(MOXy)擴展來執行此操作。 MOXy允許您將JAXB元數據指定為XML文件。 當您無法修改模型類時,這很有用:
以下是一些解釋@XmlAdapter的文章:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.