Menno
Menno

Reputation: 12621

Using JAXB&MOXy to convert JPA entities to XML and back again

I am stuck with (I guess) a pretty trivial problem considering MOXy. Converting a class like this example (pastebin) to XML is no problem, converting it back goes without any errors too. Though, fields that are referencing another (or more) Person, will result in a null value.

Is there any way to make this work without losing relationships? My guess is this is due to a reference by ID only, since JAXB has no way of knowing other existing objects. I have tried using @XmlInverseReference, though this resulted in an infinite loop on every try.

Upvotes: 2

Views: 1417

Answers (1)

bdoughan
bdoughan

Reputation: 149017

EclipseLink MOXy's @XmlInverseReference is used to solve the infinite loop problem. I will demonstrate below with an example based on your model:

Person

package forum15821738;

import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.*;

import org.eclipse.persistence.oxm.annotations.XmlInverseReference;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Person implements Serializable {

    private String name;

    @XmlInverseReference(mappedBy="children")
    private Person parent;

    @XmlElementWrapper
    @XmlElement(name="child")
    private List<Person> children;

    public Person getParent() {
        return parent;
    }

    public List<Person> getChildren() {
        return children;
    }

    // OTHER GETTERS AND SETTERS

}

jaxb.properties

To specify MOXy as your JAXB provider you need to include a file called jaxb.properties in the same package as your domain model with the following entry (see: http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

Demo

package forum15821738;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum15821738/input.xml");
        Person person = (Person) unmarshaller.unmarshal(xml);

        for(Person child : person.getChildren()) {
            System.out.println(child.getParent());
        }

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

}

Input/Output

forum15821738.Person@5893a012
forum15821738.Person@5893a012
<?xml version="1.0" encoding="UTF-8"?>
<person>
   <name>Jane</name>
   <children>
      <child>
         <name>Bobbie</name>
      </child>
      <child>
         <name>Sue</name>
      </child>
   </children>
</person>

For More Information

Upvotes: 2

Related Questions