2012-10-22 48 views
4

我想在派生類中編組一個XMLAttribute,但我遇到了一些問題。派生類中的元帥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) {} 
} 

假設我有填充了一些數據的列表。 我要生成從我的課這樣的XML:

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

我的問題是,我得到了我想要的,除了類型屬性是什麼。我嘗試了其他不同的解決方案,在超類中移動屬性類型,或者覆蓋派生類型字段,但沒有結果。 請問,有什麼建議?

回答

1

JAXBContext意識到子類

JAXB (JSR-222)執行不自動感知映射類的子類。您將需要將它們包括在用於引導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)。

+1

感謝@Blaise。我用Eclipse JAXB(MOXy)獲得了它...它更加有用和實用。我用你正確的筆記更新了我的問題。 – mulp