我有以下域名模型:
@XmlDiscriminatorNode("@type")
class Vehicle
@XmlDiscriminatorValue("car")
class Car extends Vehicle
@XmlDiscriminatorValue("tank")
class Tank extends Vehicle
@XmlDiscriminatorValue("sedan")
class Sedan extends Car
在我的顶级模型类中,我有一个List<Vehicle>
我要序列化。我想用moxy序列化这个模型,以便Sedan中的字段显示出来。当我向Vehicle添加XmlDiscriminatorNode
并将XmlDiscriminatorValue
添加到扩展类时,只序列化第一级继承。在上面的例子中,Car的属性显示但不是Sedan的属性。如何注释这些类以便显示Sedan的属性?
答案 0 :(得分:1)
当JAXB为模型派生元数据时,会处理传递关系。处理类时,还会处理其超类,但不处理其子类。为了克服这个问题,您需要让JAXB知道子类。一种方法是使用@XmlSeeAlso
注释。
我将使用您问题中的Java模型进行以下更改:
<强>车辆强>
我添加了@XmlSeeAlso
注释。只需要添加叶类,因为处理Sedan
将导致处理Car
类。
import javax.xml.bind.annotation.XmlSeeAlso;
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorNode;
@XmlDiscriminatorNode("@type")
@XmlSeeAlso({Tank.class, Sedan.class})
class Vehicle {}
<强>轿车强>
我已向Sedan
类添加了一个属性,以显示它出现在编组结果中。
import org.eclipse.persistence.oxm.annotations.XmlDiscriminatorValue;
@XmlDiscriminatorValue("sedan")
class Sedan extends Car {
private String sedanProperty;
public String getSedanProperty() {
return sedanProperty;
}
public void setSedanProperty(String sedanProperty) {
this.sedanProperty = sedanProperty;
}
}
<强>富强>
以下是您在问题中描述的具有List
个Vehicle
个对象的根类。
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Foo {
private List<Vehicle> vehicles = new ArrayList<Vehicle>();
@XmlElement(name="vehicle")
public List<Vehicle> getVehicles() {
return vehicles;
}
}
<强>演示强>
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Foo.class);
Sedan sedan = new Sedan();
sedan.setSedanProperty("Sedan Value");
Foo foo = new Foo();
foo.getVehicles().add(sedan);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(foo, System.out);
}
}
<强>输出强>
<?xml version="1.0" encoding="UTF-8"?>
<foo>
<vehicle type="sedan">
<sedanProperty>Sedan Value</sedanProperty>
</vehicle>
</foo>