4

派生クラスで XMLAttribute をマーシャリングしたいのですが、問題があります。

次のように、2 つの派生クラスと 1 つのスーパー クラスがあります。

public class Dog extends Animal {

    @XmlAttribute(name = "type")
    private String type;

    @XmlElement
    private String name;
}

public class Cat extends Animal {

    @XmlAttribute(name = "type")
    private String type;

    @XmlElement
    private String name;
}

@XmlSeeAlso({Dog.class, Cat.class})
public class Animal {

}

@XmlRootElement(name="some_element_wrapper")
public SomeElementWrapper() {

    List<Animal> listAnimal;

    @XmlElement(name = "animals")
    public List<Animal> getListAnimal() {}
    public void setListAnimal(List<Animal> listAnimal) {}
}

いくつかのデータが入力された List があるとします。次のようにクラスから XML を生成したい:

<some_element_wrapper>
    <animals>
        <animal type="dog">....</animal>
        <animal type="cat">....</animal>
    </animals>
</some_element_wrapper>

私の問題は、 type 属性以外に必要なものを取得することです。スーパークラスで属性タイプを移動するか、派生タイプフィールドをオーバーライドするなど、他のさまざまなソリューションを試しましたが、結果はありませんでした。何か提案はありますか?

4

1 に答える 1

1

サブクラスをJAXBContext認識させる

JAXB(JSR-222)実装は、マップされたクラスのサブクラスを自動的に認識しません。ブートストラップに使用されるクラスの配列にそれらを含めるか、マップされたクラスの1つにアノテーションをJAXBContext使用する必要があります。@XmlSeeAlso

@XmlSeeAlso(Dog.class, Cat.class)
public class Animal {

}

継承インジケーター

type属性を使用して使用されているサブタイプを指定する場合は、それを行わず、代わりに属性を使用することをお勧めしxsi:typeます。これは、継承がXML(XMLを使用してXMLスキーマ)で表現され、JAXBでデフォルトの表現になる方法です。

xsi:type本当に属性を使用したくない場合は、を活用して属性を継承インジケーターとしてXmlAdapter使用できます。type

EclipseLink JAXB(MOXy)は、このユースケースを容易にする拡張機能(@XmlDescrinatorNode/@XmlDescrimatorValue

于 2012-10-22T14:15:00.750 に答える