2012-07-17 25 views
35

Sự khác biệt giữa chú thích một lớp học với @XMLRootElement@XMLType là gì. 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 lần trong một lược đồ XML và với @XMLRootElement khi nó sẽ chỉ được sử dụng một lần - đây có phải là cách tiếp cận tốt nhất không?@XMLRootElement so với @XmlType

Câu hỏi khác nhưng có liên quan mà tôi sẽ đưa vào đây. Chú thích @XMLType có thuộc tính propOrder để chỉ định thứ tự mà các phần tử của nó xuất hiện - có tương đương với @XMLRootElement không?

Tôi đang sử dụng các chú thích này cùng với chú thích JAX-WS để tạo các dịch vụ web nếu có bất kỳ sự khác biệt nào.

Trả lời

17

Sự khác biệt giữa XmlRootElementXmlType là vấn đề phạm vi. Hãy nhớ rằng chú thích này chỉ đơn thuần là quyết định việc tạo lược đồ được sử dụng để tạo ra XML của bạn. Các XmlRootElement biểu thị một yếu tố toàn cầu (với một loại vô danh hoặc schema):

<xs:element name=foo type="bar"> </xs:element> <-- schema type 

trong khi XmlType được sử dụng để biểu thị một yếu tố địa phương (với một loại vô danh hoặc phức tạp):

<xs:complexType name=bar> </xs:complexType> <-- complex type 

Các chính sự khác biệt trong địa phương/toàn cầu ở đây là trong hệ thống phân cấp của lược đồ mà đối tượng của bạn sẽ xuất hiện và liệu bạn có đang khai báo một loại lược đồ hay kiểu phức tạp hay không. Các tài liệu cho cả hai chú thích cũng được viết và bao gồm ví dụ:

XmlRootElement

XmlType

EDIT: Phát biểu câu hỏi propOrder: bạn có thể sử dụng nó trên một yếu tố toàn cầu nếu bạn cũng đang tuyên bố một địa phương loại:

@XmlRootElement (name="PersonElement") 
@XmlType (propOrder={"firstname", "lastname"}) 
public class People{ 
    @XmlElement 
    public String firstname; 
    public String lastname; 
} 

này sẽ mang lại một cái gì đó như:

<xs:element name="PersonElement" type="People"/> 
<xs:complexType name="People"> 
    <xs:sequence> 
     <xs:element name="firstname" type="xs:string"/> 
     <xs:element name="lastname" type="xs:string"/> 
    </xs:sequence> 
</xs:complexType> 
17

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@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 { 
    ... 
} 
Các vấn đề liên quan