2011-03-22 21 views
6

Mam do klasy ParentClass i ChildClass w JAVA przy użyciu JAXB. ChildClass rozszerza ParentClass. Kiedy serializuje obiekt klasy ChildClass, w wynikowym pliku XML właściwości ParentClass pojawiają się jako pierwsze, najpierw chciałbym mieć właściwości ChildClass, a następnie ParentClass.Zamów xml elementów superklasy w serializacji Java

Czy to możliwe?

Dziękuję

Odpowiedz

9

Powodem JAXB ma to, aby dopasować dziedziczenia w schemacie XML. Jednakże, można zrobić coś jak poniżej:

  • Zaznaczyć @XmlTransient rodzic
  • Ustaw propOrder od klasy dziecięcej

nadrzędna

import javax.xml.bind.annotation.XmlTransient; 

@XmlTransient 
public abstract class Parent { 

    private String parentProp; 

    public String getParentProp() { 
     return parentProp; 
    } 

    public void setParentProp(String parentProp) { 
     this.parentProp = parentProp; 
    } 

} 

Child

import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlRootElement 
@XmlType(propOrder={"childProp", "parentProp"}) 
public class Child extends Parent { 

    private String childProp; 

    public String getChildProp() { 
     return childProp; 
    } 

    public void setChildProp(String childProp) { 
     this.childProp = childProp; 
    } 

} 

Demo

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.Marshaller; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Child.class); 

     Child child = new Child(); 
     child.setParentProp("parent-value"); 
     child.setChildProp("child-value"); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(child, System.out); 
    } 

} 

Wyjście

<child> 
    <childProp>child-value</childProp> 
    <parentProp>parent-value</parentProp> 
</child> 
+0

chłodny odpowiedź 1. działa to w przypadku sprawdzania poprawności schematu (podczas odtajniania)? 2. czy będzie działać z @XmlTransient ale bez zlecenia – ekeren

+1

@ekeren - 1. Zależnie od tego, jak wygląda schemat XML, jeśli istnieje dziedziczenie między typami złożonymi, oczekuje się, że właściwości typu nadrzędnego wystąpią przed właściwościami typu child. 2. Tak, ale bez propozycji zamówienia kolejność zależy od implikowanego JAXB. –

+0

@BlaiseDoughan jest inny sposób, aby najpierw mieć właściwości potomne bez właściwości macierzystych typu hartcoding? mając adnotacje takie jak te adnotacje o dzieciach, narusza to nieco paradygmat OOP ... Używam EclipseLink MOXy – basZero

Powiązane problemy