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>
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
@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. –
@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