具有多个继承级别的XmlDiscriminatorNode / XmlDiscriminatorValue

时间:2014-01-09 20:40:11

标签: java jax-rs moxy

我有以下域名模型:

@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的属性?

1 个答案:

答案 0 :(得分:1)

当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;
    }

}

<强>富

以下是您在问题中描述的具有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>