Tôi đã chú thích các lớp học với @XMLType khi cấu trúc sẽ được sử dụng nhiều hơn một lần trong một lược đồ XML và với @XMLRootElement khi nó sẽ được sử dụng một lần duy nhất - đây là phương pháp tốt nhất?
Một điều cần biết là không cần chú thích @XmlRootElement
hoặc @XmlType
. Chúng không tương đương với @Entity
từ JPA. Bạn có thể sử dụng thực hiện JAXB (JSR-222) mà không cần bất kỳ chú thích gì vậy bao giờ:
Dưới đây tôi sẽ giải thích những gì @XmlRootElement
và @XmlType
làm.
@XmlRootElement
Có những lúc thực hiện JAXB của bạn cần phải tạo một đối tượng chỉ dựa trên các yếu tố XML đang được xử lý. Chú thích @XmlRootElement
là phương tiện chính để chỉ định liên kết này. Lưu ý nếu một lớp tương ứng với nhiều hơn một phần tử XML thì @XmlElementDecl
chú thích nên được sử dụng insteat,
VAI TRÒ # 1 - Xác định gốc Object
@XmlRootElement
chủ yếu được dùng để xác định đối tượng gốc. Điều này là như vậy khi thực hiện JAXB của bạn bắt đầu unmarshalling một tài liệu XML nó biết những gì đối tượng để nhanh chóng. Hầu như tất cả các chú thích tiếp theo sẽ dựa trên thông tin được thu thập từ lớp cha.
Foo
@XmlRootElement(name="root")
public class Foo {
private String name;
}
Bar
public class Bar {
private String name;
}
XML
<root>
<name>Jane Doe</name>
</root>
Demo
Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();
VAI TRÒ # 2 - Thay Groups
Các @XmlElementRef
đại biểu chú thích các loại đối tượng khởi tạo tên/uri của phần tử. Điều này cho phép ánh xạ tới khái niệm các nhóm thay thế để biểu diễn thừa kế.
VAI TRÒ # 3 - Bất kỳ nội dung
@XmlAnyElement
cho phép bạn ánh xạ một phần thẻ hoang dã của tài liệu XML của bạn. Nếu bạn chỉ định @XmlAnyElement(lax=true)
thì các phần tử được liên kết với đối tượng miền sẽ được chuyển đổi thành đối tượng miền tương ứng.
@XmlType
VAI TRÒ # 1 - Schema Gen
Theo mặc định một loại phức tạp được đặt tên được tạo ra cho mỗi lớp Java được biết đến Ngữ cảnh JAXB. Bạn có thể kiểm soát tên của loại này bằng cách sử dụng chú thích @XmlType
hoặc chỉ định rằng một loại phức tạp ẩn danh sẽ được tạo bằng cách chỉ định tên là ""
.
VAI TRÒ # 2 - Thừa kế và xsi: type
Theo mặc định JAXB thúc đẩy các thuộc tính xsi:type
như chỉ số thừa kế. Giá trị trên thuộc tính này tương ứng với tên và không gian tên bạn đã chỉ định trên chú thích @XmlType
hoặc được đặt mặc định dựa trên lớp.
VAI TRÒ # 3 - Prop tự
Như bạn đề cập đến bạn có thể sử dụng @XmlType
để xác định thứ tự bất động sản.
VAI TRÒ # 4 - Phương pháp Factory
@XmlType
phép bạn chỉ định một lớp nhà máy và/hoặc các phương pháp có thể được sử dụng để nhanh chóng các đối tượng miền thay vì mặc định constructor.
Một câu hỏi khác nhau nhưng có liên quan mà tôi sẽ bao gồm ở đây. Chú thích @XMLType có thuộc tính propOrder để chỉ định thứ tự xuất hiện của các phần tử đó là - có tương đương với @XMLRootElement không?
Không, khía cạnh propOrder
thuộc về chú thích @XmlType
. Điều này có ý nghĩa vì các loại phức tạp có trách nhiệm xác định một (hoặc thiếu) thứ tự. Tất nhiên, bạn có thể sử dụng các chú thích này cùng một lúc.
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
...
}