2012-09-18 17 views
6

Diciamo che ho classedichiarare proporder sopra classe estesa

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

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

    protected One one; 
    protected Two two; 

    //getters & setters 
} 

e volevo una classe che estende questa classe

esempio

come si fa a dichiarare correttamente il propOrder, ho provato questo prima e non ha utilizzato l'ordine ho pensato che sarebbe. Come viene gestito da annotazioni?/come dovresti dichiararlo attraverso classi estese?

+0

Quali sono nell'ordine desiderato e quello in uscita? – Gabber

risposta

8

Le proprietà dei genitori verranno sottoposte a marshalling in base al loro ordine specificato prima delle proprietà figlio. È possibile includere le proprietà dalla classe padre nello propOrder della classe figlio se si annota la classe genitore con @XmlTransient.


UPDATE

C'è un modo per rendere transistant ma ancora usarla normalmente?

No, l'impostazione di @XmlTransient su una classe lo rimuove dalle classi considerate da JAXB. La ragione per cui JAXB marha le proprietà della super classe prima che le proprietà della sottoclasse corrispondano alle regole dello schema XML. Quando la classe Search non è contrassegnata con @XmlTransient, lo schema XML corrispondente è il seguente. In base alle regole dello schema XML, affinché un elemento di tipo searchExtended sia valido, gli elementi del tipo super devono essere presenti prima di qualsiasi elemento definito nel sottotipo.

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

Potete vedere lo schema XML che corrisponde al modello JAXB eseguendo il seguente codice:

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

grazie per la risposta questo fa quello che cercavo per la classe estesa. tuttavia ora la classe base è inutilizzabile e richiede una classe estesa per utilizzare solo gli attributi di base, ho creato un contenitore per incollare per mostrare la mia struttura ora http://pastebin.com/fDTb1q5A, c'è un modo per renderlo transistante ma comunque utilizzare normalmente –

+0

anche io intendevo Transient not Transistant :) –

+1

grazie mille per la tua risposta aggiornata, mi ha aiutato molto. Apprezzo lo sforzo. –

Problemi correlati