簡體   English   中英

JAXB:反序列化擴展A類的B類的問題

[英]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();
        }
    }
}

順便說一句:不要把代碼太嚴肅 - 這只是一個證明問題的例子。 我知道ClassAClassB的定義並不真正有用。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM