JAXB cyclic reference with colliding id values (between parent and children)



I have a problem while unmarshalling some xml in objects with cyclic references to one another. This is my xml:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<computer>
<computerId>3</computerId>
<keyboard>
<computer>3</computer>
<keyboardId>3</keyboardId>
</keyboard>
<keyboard>
<computer>3</computer>
<keyboardId>1</keyboardId>
</keyboard>
</computer>


And here are my JAXB enabled classes: Computer.java:



@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "computer", propOrder = {
"computerId",
"keyboard"
})
@XmlRootElement
public class Computer {

@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlID
@XmlSchemaType(name = "ID")
protected String computerId;
protected List<Keyboard> keyboard;

public String getComputerId() {
return computerId;
}

public void setComputerId(String value) {
this.computerId = value;
}

public List<Keyboard> getKeyboard() {
if (keyboard == null) {
keyboard = new ArrayList<Keyboard>();
}
return keyboard;
}
}


Keyboard.java:



@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "keyboard", propOrder = {
"computer",
"keyboardId"
})
public class Keyboard {

@XmlElement(type = Computer.class)
@XmlIDREF
@XmlSchemaType(name = "IDREF")
protected Computer computer;
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlID
@XmlSchemaType(name = "ID")
protected String keyboardId;

public Computer getComputer() {
return computer;
}

public void setComputer(Computer value) {
this.computer = value;
}

public String getKeyboardId() {
return keyboardId;
}

public void setKeyboardId(String value) {
this.keyboardId = value;
}

}


When I try to unmarshal the xml uptop the second keyboard object has its computer field null. If I try it with this xml (notice the order of the two keyboards changed) everything works fine:



<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<computer>
<computerId>3</computerId>
<keyboard>
<computer>3</computer>
<keyboardId>1</keyboardId>
</keyboard>
<keyboard>
<computer>3</computer>
<keyboardId>3</keyboardId>
</keyboard>
</computer>


Can somebody help me so that both examples can be unmarshalled without any null fields.


Thanks.


No comments:

Post a Comment