JAXB - 解组多态对象

5

我将要翻译的XML内容如下(当然还有很多其他属性):

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

有大约十几种不同的类型。我正在使用注释将其映射到类似于以下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;
}

我该如何让JAXB根据“kind”字段创建子类化的Item对象?

可能是重复的问题:Java/JAXB:根据属性将Xml解组为特定的子类 - bdoughan
你说得对...我在发布前进行了搜索,但不知何故错过了它。 - dave
1个回答

4

有几种不同的方法:

JAXB (JSR-222)

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

EclipseLink JAXB(MOXy)

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

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

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


谢谢,这是一个好答案,但我需要得到我的IT团队的批准才能将其包含在我们的服务器平台中。 - dave
同时,是否有使用适配器在标准版本中执行此操作的示例? - dave
虽然没有标准的JAXB发布版本(Java SE 6实现只需要提供一个JAXB实现),但我已经更新了我的答案,提供了一种适用于任何JAXB实现的方法。 - bdoughan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接