【问题标题】:Using Inheritance with JAXB通过 JAXB 使用继承
【发布时间】:2017-12-20 09:33:53
【问题描述】:

我有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);

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

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    我认为有几个选择。最简单的方法是为您的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 标记。

    【讨论】:

    • 我在课堂上使用了注释@XmlSeeAlso({StructUserType.class, ListUserType.class})。有效。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2014-01-04
    相关资源
    最近更新 更多