2012-09-18 31 views
6

phép nói rằng tôi có lớpkhai báo proporder trên lớp mở rộng

@XmlType(propOrder = { 
     "one", 
     "two" 
    }) 

@XmlRootElement(name = "search") 
public class Search { 

    protected One one; 
    protected Two two; 

    //getters & setters 
} 

và tôi muốn có một lớp mở rộng lớp này

ví dụ

cách bạn khai báo lệnh propOrder chính xác, tôi đã thử trước và không sử dụng thứ tự tôi nghĩ. Cách này được xử lý bằng chú thích?/làm thế nào bạn nên tuyên bố điều này trên các lớp mở rộng?

+0

Đó là những thứ tự mong muốn và một trong những outcoming? – Gabber

Trả lời

8

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; 
      } 

     }); 
    } 

} 
+0

cảm ơn vì câu trả lời này làm những gì tôi đã làm sau cho lớp mở rộng. Tuy nhiên bây giờ lớp cơ sở là không thể sử dụng và yêu cầu một lớp mở rộng để chỉ sử dụng các thuộc tính cơ bản, ive đã tạo một thùng dán để hiển thị cấu trúc của tôi bây giờ http://pastebin.com/fDTb1q5A, có cách nào tôi có thể làm cho nó transistant nhưng vẫn sử dụng bình thường. –

+0

tôi cũng có nghĩa là Transient không Transistant :) –

+1

cảm ơn rất nhiều cho câu trả lời cập nhật của bạn, đã giúp tôi rất nhiều. Tôi đánh giá cao nỗ lực này. –

Các vấn đề liên quan