2011-03-22 7 views
6

Tengo las clases ParentClass y ChildClass en JAVA usando JAXB. ChildClass extends ParentClass. Cuando serializo un objeto de ChildClass, en el XML resultante, las propiedades de ParentClass aparecen primero, me gustaría tener las propiedades de ChildClass primero y luego las propiedades de ParentClass.Pedir elementos de superclase xml en la serialización de Java

¿Esto es posible?

Gracias

Respuesta

9

La razón JAXB tiene esto es para que coincida con la herencia de esquema XML. Sin embargo, se podría hacer algo como lo siguiente:

  • Marque la @XmlTransient padres
  • Ajuste el propOrder en la clase hija

Padres

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

} 

Niño

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

} 

demostración

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

} 

salida

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

respuesta fresco, 1. funciona esto con la validación de esquema (cuando se desmarca)? 2. ¿Funcionará con @XmlTransient pero sin proporion – ekeren

+1

@ekeren - 1. Depende de cómo se ve el esquema XML, si hay herencia entre los tipos complejos, entonces se espera que las propiedades de los tipos padre ocurran antes de que el niño escriba las propiedades. 2. Sí, pero sin propOrder el orden depende de JAXB impl. –

+0

@BlaiseDoughan ¿hay alguna otra manera de tener primero propiedades secundarias sin tener que codificar las propiedades principales? Tener anotaciones como estas anotaciones para niños, viola un poco el paradigma de OOP ... Estoy usando EclipseLink MOXy – basZero