Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Order xml superclass elements in Java serialization

I have two classes ParentClass and ChildClass in JAVA using JAXB. ChildClass extends ParentClass. When I serialize an object of ChildClass, in the resulting XML, ParentClass properties appear first, I would like to have ChildClass properties first and then ParentClass properties.

Is this possible?

Thank you

like image 693
Lince81 Avatar asked Mar 22 '11 16:03

Lince81


1 Answers

The reason JAXB does this is to match inheritance in XML schema. However, you could do something like the following:

  • Mark the parent @XmlTransient
  • Set the propOrder on the child class

Parent

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

}

Output

<child>
    <childProp>child-value</childProp>
    <parentProp>parent-value</parentProp>
</child>
like image 163
bdoughan Avatar answered Oct 22 '22 04:10

bdoughan