我有以下域模型:
@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中的字段。当我将XmlDiscriminatorNode
添加到Vehicle并将XmlDiscriminatorValue
添加到扩展类时,仅继承的第一级被序列化。在上面的示例中,显示了Car的属性,但没有显示Sedan的属性。如何注释这些类,以便显示Sedan的属性? 最佳答案
当JAXB导出模型的元数据时,将处理传递关系。处理一个类时,还将处理其超类,但不处理其子类。为了克服这个问题,您需要使JAXB知道这些子类。一种方法是使用@XmlSeeAlso
批注。
Java模型
我将使用您的问题中的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;
}
}
oo
这是您在问题中描述的具有
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>
关于java - 具有多个继承级别的XmlDiscriminatorNode/XmlDiscriminatorValue,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21030643/