JAXBElement được sử dụng để bảo toàn tên phần tử/không gian tên trong các trường hợp sử dụng khi không có đủ thông tin trong mô hình đối tượng. Sự xuất hiện phổ biến nhất là với các nhóm thay thế:
Với Thay Nhóm:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="anElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="anElement" type="xs:string"/>
<xs:element name="aSubstituteElement" type="xs:string" substitutionGroup="anElement"/>
</xs:schema>
sẽ generate:
package org.example;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"anElement"
})
@XmlRootElement(name = "root")
public class Root {
@XmlElementRef(name = "anElement", namespace = "http://www.example.org", type = JAXBElement.class)
protected JAXBElement<String> anElement;
public JAXBElement<String> getAnElement() {
return anElement;
}
public void setAnElement(JAXBElement<String> value) {
this.anElement = ((JAXBElement<String>) value);
}
}
Without Thay Nhóm:
Nếu bạn loại bỏ nhóm thay thế:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="anElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="anElement" type="xs:string"/>
</xs:schema>
Lớp sau đây sẽ được tạo ra:
package org.example;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"anElement"
})
@XmlRootElement(name = "root")
public class Root {
@XmlElement(required = true)
protected String anElement;
public String getAnElement() {
return anElement;
}
public void setAnElement(String value) {
this.anElement = value;
}
}
Bạn cũng có thể có được một JAXBElement khi bạn unmarshal, so sánh các ví dụ sau:
Nguồn
2010-09-07 14:03:44
Xem http://stackoverflow.com/questions/3639313/xsd-formatting-elementcomplextype-vs-complextype-element/3639375#3639375 để được giải thích – skaffman
@skaffman: Eh? Tôi không thấy câu trả lời của bạn liên quan đến việc liệu xjc có chọn 'JAXBElement' trên 'Foo' hay không. –
@Chris: Bởi vì nó được xác định một phần bởi sự lựa chọn của các loại vô danh hoặc các loại tên trong lược đồ nguồn. – skaffman