我有以下域模型:

@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

这是您在问题中描述的具有ListVehicle对象的根类。

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/

10-09 08:42