[英]How do Inheritance and JAXB work together?
public abstract class Parent<T> {
protected List<T> list;
@XmlTransient //Question why do we have to give this here?
public abstract List<T> getList();
public abstract void setList(List<T> list);
}
@XmlRootElement(name = "child1")
class Child1 extends Parent<ExtendedElement1>{
@Override
public void setList(List<ExtendedElement1> list){
this.list = list;
}
@Override
@XmlElementWrapper(name = "child1-list")
@XmlElement(name = "child-list-element")
public List<ExtendedElement1> getList(){
return this.list;
}
}
@XmlRootElement(name = "child2")
class Child2 extends Parent<ExtendedElement2>{
@Override
public void setList(List<ExtendedElement2> list){
this.list = list;
}
@Override
@XmlElementWrapper(name = "child1-list")
@XmlElement(name = "child-list-element")
public List<ExtendedElement2> getList(){
return this.list;
}
}
class Element{
@XmlElement(name = "integer", type = int.class)
private int i = 2;
}
class ExtendedElement1 extends Element{
@XmlElement(name = "extended-element1-str", type = String.class)
private String str = "hello";
}
class ExtendedElement2 extends Element{
@XmlElement(name = "extended-element2-str", type = String.class)
private String str1 = "hello_there";
}
正如我在示例中所示,當我從Parent
類getList()
方法中刪除 @XmlTransient
時,以下xml被編組:
<child1>
<!-- List is serialized 2 times -->
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="extendedElement1">
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</list>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="extendedElement1">
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</list>
<list xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="extendedElement1">
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</list>
<child1-list>
<child-list-element>
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</child-list-element>
<child-list-element>
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</child-list-element>
<child-list-element>
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</child-list-element>
</child1-list>
</child1>
但是當我添加 @XmlTransient
注釋時,就像在示例中一樣,xml被序列化,只需要一個列表。
<child1>
<child1-list>
<child-list-element>
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</child-list-element>
<child-list-element>
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</child-list-element>
<child-list-element>
<integer>2</integer>
<extended-element1-str>hello</extended-element1-str>
</child-list-element>
</child1-list>
</child1>
所以請有人解釋一下為什么需要在Parent Class getter方法中提供@XmlTransient
? 對於這些情況,繼承和JAXB如何相互關聯?
為什么會發生這種情況
JAXB(JSR-222)實現會將其知道的每個域對象映射到復雜類型。 這意味着它認為Parent
類存在以下XML類型(當list
不是@XmlTransient
)。
<xs:complexType name="parent" abstract="true">
<xs:sequence>
<xs:element name="list" type="xs:anyType" nillable="true" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
現在Child2
也有一個復雜的類型。 JAXB可以完成兩件事:
child2
類型擴展parent
。 這意味着它從parent
類型中獲取所有元素以及它自己的元素。 <xs:complexType name="child2">
<xs:complexContent>
<xs:extension base="parent">
<xs:sequence>
<xs:element name="child1-list" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="child-list-element" type="extendedElement2" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:extension>
</xs:complexContent>
如何修復它
您可以將@XmlTransient
放在Parent
類的list
屬性中,但我建議使用@XmlTransient
注釋Parent
類。
import java.util.List;
import javax.xml.bind.annotation.XmlTransient;
@XmlTransient
public abstract class Parent<T> {
protected List<T> list;
public abstract List<T> getList();
public abstract void setList(List<T> list);
}
這將把它作為映射類刪除,對應於Child2
的復雜類型將變為:
<xs:complexType name="child2">
<xs:sequence>
<xs:element name="child1-list" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="child-list-element" type="extendedElement2" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.