java - 将继承与 JAXB 结合使用

标签 java xml jaxb

我有 xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<UserTypes>
    <UserType Id="1">
        <Members>
            <Member UserTypeId="4" Name="Name1" />
            <Member UserTypeId="1" Name="Name2" />
        </Members>
    </UserType>
    <UserType Id="23" ItemUserTypeId="232">
        <Description />
    </UserType>
</UserTypes>

某些元素具有特定的嵌套元素和属性。在 Java 中,我创建了通用类及其继承者:

@XmlAccessorType(XmlAccessType.FIELD)
public class UserType {

    @XmlAttribute(name = "Id", required = true)
    private Integer id;

    private UserTypeKind userTypeKindType;
    //getters and setters
}

@XmlAccessorType(XmlAccessType.FIELD)
public class StructUserType extends UserType {

    @XmlElement(name = "Members")
    MembersList membersList =  new MembersList();

    static class MembersList {
        @XmlElement(name = "Member")
        List<Member> members = new ArrayList<>();
    }

    static class Member {
        @XmlAttribute(name = "Name", required = true)
        String name;

        @XmlAttribute(name = "UserTypeId", required = true)
        long userTypeId;
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
public class ListUserType extends UserType {

    @XmlAttribute(name = "ItemUserTypeId", required = true)
    private long itemUserTypeId;

    public long getItemUserTypeId() {
        return itemUserTypeId;
    }

    public void setItemUserTypeId(long itemUserTypeId) {
        this.itemUserTypeId = itemUserTypeId;
    }
}

我想将我的对象编码为 xml。我愿意:

List<UserType> userTypes = new ArrayList<>();

StructUserType structUserType = new StructUserType();
smbpStructUserType.setId(1);
SmbpStructUserType.Member member1  = new SmbpStructUserType.Member();
member1.name = "Name1";
member1.userTypeId = 4;
SmbpStructUserType.Member member2  = new SmbpStructUserType.Member();
member2.name = "Name2";
member2.userTypeId = 1;
structUserType.membersList.members.add(member1);
structUserType.membersList.members.add(member2);


ListUserType listUserType = new ListUserType();
listUserType.setId(23);
smbpListUserType.setItemUserTypeId(232);

userTypes.add(structUserType);

但是当我尝试进行编码(marshal)时,只有落入最终 xml 的元素仅在主类 (UserType) 中定义,所有元素都是从主类继承的。这有什么问题吗? 需要什么样的 JAXB 配置才能使子类的元素也落入最终的 xml 中?

最佳答案

我认为有几个选择。最简单的就是给你的UserType标记两个不同的名称,例如 StructUserTypeListUserType 。然后你需要在根元素中指定哪个名称适合哪个类

@XmlElements({
            @XmlElement(name = "StructUserType", type = StructUserType.class),
            @XmlElement(name = "ListUserType", type = ListUserType.class)
    })
    private List<UserType> userTypse;

另一个选项是使用@XmlJavaTypeAdapter(YourAddapter.class) ,在 YourAddapter 类中扩展 XmlAdapter 类并覆盖 marshal方法,您可以在其中指定如何整理您的 UserType 标记。

关于java - 将继承与 JAXB 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47902797/

相关文章:

java - JAXB 如何将嵌套的 xml 元素解码到字符串中?

java - 如何将运行时数据注入(inject)使用 JAXB 解析 XML 时创建的对象

JAXB schemagen 如何为两个字段生成选择?

java - 在 Java 7 中删除了 cacerts,我可以恢复它吗?

java - 是否可以在java邮件正文中编写javascript函数代码?

java - 如何在每个第 n 个单词处拆分字符串数组?

android - 对于有这么多数据的东西,JSON 比 XML 好吗 "classification"

java - 将 JSF 应用程序迁移到 JavaFX

xml - XSLT 文档 ('' ) 函数不起作用

Python 3 XML xml.etree 解析标准输出 bash cli 命令