简体   繁体   中英

JAXB - Unmarshalling polymorphic objects

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?

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:

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:

We improved this support in the EclipseLink 2.2 release:

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM