Thuộc tính cha mẹ sẽ được sắp xếp theo thứ tự được chỉ định của chúng trước các thuộc tính con. Bạn có thể bao gồm các thuộc tính từ lớp cha trong lớp propOrder
của lớp con nếu bạn chú thích lớp cha với @XmlTransient
.
CẬP NHẬT
Có cách nào tôi có thể làm cho nó transistant nhưng vẫn sử dụng nó thường?
Không, đặt @XmlTransient
trên một lớp sẽ loại bỏ nó khỏi các lớp mà JAXB coi là ánh xạ. Lý do mà JAXB marhals các thuộc tính của lớp siêu trước các thuộc tính của lớp con là để phù hợp với các quy tắc của lược đồ XML. Khi lớp học Search
của bạn không được đánh dấu bằng @XmlTransient
, lược đồ XML tương ứng là như sau. Theo các quy tắc lược đồ XML để cho một phần tử kiểu searchExtended
hợp lệ thì các phần tử từ kiểu siêu phải xảy ra trước khi bất kỳ phần tử nào được định nghĩa trong kiểu con.
<xs:complexType name="searchExtended">
<xs:complexContent>
<xs:extension base="search">
<xs:sequence>
<xs:element name="three" type="three" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="search">
<xs:sequence>
<xs:element name="one" type="one" minOccurs="0"/>
<xs:element name="two" type="two" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
Bạn có thể xem lược đồ XML tương ứng với mô hình JAXB bạn bằng cách chạy đoạn mã sau:
import java.io.IOException;
import javax.xml.bind.*;
import javax.xml.transform.Result;
import javax.xml.transform.stream.StreamResult;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(SearchExtended.class);
jc.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceUri,
String suggestedFileName) throws IOException {
StreamResult result = new StreamResult(System.out);
result.setSystemId(suggestedFileName);
return result;
}
});
}
}
Nguồn
2012-09-18 10:52:32
Đó là những thứ tự mong muốn và một trong những outcoming? – Gabber