Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB - Unmarshalling polymorphic objects

Tags:

java

jaxb

I'm given XML that looks like (lots more attributes of course):

<inventory>
  <item kind="GRILL" tag=123 brand="WEBER"/>
  <item kind="CAR" tag=124 make="FORD" model="EXPLORER" />
</inventory>

with about a dozen different kinds. I am using annotations to map to java classes that look like:

@XmlRootElement(name="inventory")
public class Inventory {
  @XmlElement(name="item")
  public List<Item> itemList = new LinkedList<Item>;
}
abstract public class Item {
  @XmlAttribute public int tag;
}
public class Grill extends Item {
  @XmlAttribute public string brand;
}
public class Car extends Item {
  @XmlAttribute public string make;
  @XmlAttribute public string model;
}

How can I get JAXB to create the sub-classed Item objects based on the "kind" field?

like image 436
dave Avatar asked Oct 11 '22 10:10

dave


1 Answers

There area couple of different approaches:

JAXB (JSR-222)

The following approach should work with any JAXB implementation (Metro, MOXy, JaxMe, etc). Use an XmlAdapter where the adapted object contains the properties of the parent class and all the subclasses. In the XmlAdapter add the logic of when a particular subclass should be used. For an example see the link to a similar question below:

  • Java/JAXB: Unmarshall XML attributes to specific Java object attributes

EclipseLink JAXB (MOXy)

You could use the @XmlDescriminatorNode extension in EclipseLink JAXB (MOXy) to handle this use case.

Check out my answer to a similar question:

  • Java/JAXB: Unmarshall Xml to specific subclass based on an attribute

We improved this support in the EclipseLink 2.2 release:

  • http://bdoughan.blogspot.com/2010/11/jaxb-and-inheritance-moxy-extension.html
like image 177
bdoughan Avatar answered Oct 26 '22 23:10

bdoughan