java - 使用 JAXB 映射包含父类(super class)型和子类型的 Java 集合

标签 java collections jaxb

我正在尝试使用 JAXB 生成类似这样的内容:

  <person>
    <firstName>Foo</firstName>
    <lastName>Bar</lastName>
    <identities>
      <green id="greenId">
            <some_elements....
      </green>
      <blue id="blueId"/>
    </identities>

<identities>的子元素都源于一个共同的父类(super class)。

在 Java 中是这样的:

@XmlRootElement(name = "person")
public class Person {
    public String firstName; 
    public String lastName;
    @XmlElementWrapper(name = "identities")
    public Set<Identity> identities = new HashSet<Identity>();
}

在哪里IdentityBlue 的父类(super class), Green和其他一些人。

public class Identity {
    @XmlID
    @XmlAttribute
    public String id; 
}

@XmlRootElement(name = "blue")
public class Blue extends Identity {
    public String oneOfManyFields;
}

@XmlRootElement(name = "green")
public class Green extends Identity {}

如何正确注释类以获得我需要的内容?目前,输出是这样的:

<identities>
    <identities id="0815"/>
</identities>

最佳答案

只需修改您的示例以在 identities 属性上使用 @XmlElementRef 注释。

import java.util.HashSet;
import java.util.Set;

import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")
public class Person {
    public String firstName; 
    public String lastName;
    @XmlElementWrapper(name = "identities")
    @XmlElementRef
    public Set<Identity> identities = new HashSet<Identity>();
}

关于java - 使用 JAXB 映射包含父类(super class)型和子类型的 Java 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4047998/

相关文章:

java如何导入jar包中的类

java - 如果我在运行之前手动更改字节码会怎样?

java - 为什么java集合框架中没有直接实现Bag?

web-services - 如何指示 JAXB Marshaller 仅出于审核目的清理 base64Binary 数据?

java - 如何使用 jaxb2-maven-plugin 将 java 类生成到源文件夹中?

java - 如何在带有图像和文本的自定义 Material 微调器中仅获取文本

Java 8 对对象列表进行排序

java - java 中的堆空间要求 - Arrays.sort() 与 Collections.sort()

java - 根据 equals 和 hashcode 实现compareTo

java - JAXB 能否将字符串解码为日期属性