JAXB - 解组多态对象

dav*_*ave 5 java jaxb

我给了看起来像的XML(当然还有很多属性):

<inventory>
  <item kind="GRILL" tag=123 brand="WEBER"/>
  <item kind="CAR" tag=124 make="FORD" model="EXPLORER" />
</inventory>
Run Code Online (Sandbox Code Playgroud)

有十几种不同的种类.我正在使用注释来映射到看起来像这样的java类:

@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;
}
Run Code Online (Sandbox Code Playgroud)

如何让JAXB根据"kind"字段创建子类Item对象?

bdo*_*han 4

有几种不同的方法:

JAXB (JSR-222)

以下方法应该适用于任何 JAXB 实现(Metro、MOXy、JaxMe 等)。使用 XmlAdapter,其中适配的对象包含父类和所有子类的属性。在 XmlAdapter 中添加何时应使用特定子类的逻辑。有关示例,请参阅下面类似问题的链接:

EclipseLink JAXB (MOXy)

您可以使用EclipseLink JAXB (MOXy)中的 @XmlDecriminatorNode 扩展来处理此用例。

看看我对类似问题的回答:

我们在 EclipseLink 2.2 版本中改进了此支持: