2012-09-18 15 views
6

Powiedzmy mam klasastwierdzenie proporder przez dłuższy klasy

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

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

    protected One one; 
    protected Two two; 

    //getters & setters 
} 

i chciałem klasę, która rozciąga się ta klasa

przykład

jaki sposób zadeklarować propOrder poprawnie, próbowałem tego wcześniej i nie używać kolejności myślałem, że będzie. W jaki sposób jest to obsługiwane przez adnotacje?/jak powinieneś o tym zadeklarować w ramach rozszerzonych klas?

+0

Jakie są odpowiedniej kolejności, a od strony wyjścia jeden? – Gabber

Odpowiedz

8

Właściwości rodziców zostaną uporządkowane na podstawie ich określonej kolejności przed właściwościami podrzędnymi. Możesz dołączyć właściwości z klasy nadrzędnej do klasy propOrder klasy potomnej, jeśli opisujesz klasę nadrzędną za pomocą @XmlTransient.


UPDATE

Czy istnieje sposób mogę zrobić to transistant ale nadal używać go normalnie?

Nie, ustawienie @XmlTransient dla klasy usuwa ją z klas, które JAXB uważa za zmapowane. Powodem, że JAXB marhall właściwości super klasy przed właściwościami podklasy jest dopasowanie reguł schematu XML. Gdy twoja klasa Search nie jest oznaczona @XmlTransient, odpowiedni schemat XML jest następujący. Zgodnie z regułami schematu XML, aby element typu searchExtended był poprawny, elementy z supertypu muszą występować przed dowolnymi elementami zdefiniowanymi w podtypach.

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

można zobaczyć schemat XML, który odpowiada modelu JAXB uruchamiając następujący kod:

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

dzięki za odpowiedź to robi to, co byłem po rozszerzonej klasy. jednak teraz klasa podstawowa jest bezużyteczna i wymaga rozszerzonej klasy, aby używać tylko podstawowych atrybutów, i stworzyłem bin z pastami, aby pokazać moją strukturę teraz http://pastebin.com/fDTb1q5A, czy istnieje sposób, aby uczynić ją transistyczną, ale nadal używam to normalnie. –

+0

również miałem na myśli Transient not Transistant :) –

+1

bardzo dziękuję za zaktualizowaną odpowiedź, bardzo mi pomogło. Doceniam wysiłek. –

Powiązane problemy