JAXB 绑定全局替换类型与实现 Class

JAXB Bindings Globally Replace Type with Implementing Class

我正在使用 JAXB 从 XSD 生成代码。我有一个外部绑定文件,它定义了 XSD 类型之一的实现类型(使用 class 标记/implClass 属性)。当我这样做时,生成的 ObjectFactory 被修改为 return 指定实现 class 的一个实例。但是,生成的 classes 仍然使用生成的基础类型声明成员。有什么方法可以让生成的 XSD 类型的所有使用都引用我的实现类型吗?

举个例子,假设"example.xsd"如下:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" ...>
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Member" type="MemberType" maxOccurs="unbounded" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="MemberType" />
</xsd:schema>

然后,我有以下 "bindings.xjb" 文件:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          schemaLocation="example.xsd" node="/xsd:schema" version="2.1">
  <bindings node="./xsd:complexType[@name='MemberType']">
    <class implClass="myNamespace.Member" />
  </bindings>
</bindings>

在运行 xjc 生成 JAXB classes 之后,我得到一个包含以下方法的 ObjectFactory class:

public MemberType createMemberType() {
    return new Member();
}

因此工厂正确地为 MemberType 生成了我的实施实例。但是生成的Rootclass的实现包括:

protected List<MemberType> member;
public List<MemberType> getMember() {
    if (member == null) {
        member = new ArrayList<MemberType>();
    }
    return this.member;
}

我希望实现为:

protected List<Member> member;
public List<Member> getMember() {
    if (member == null) {
        member = new ArrayList<Member>();
    }
    return this.member;
}

有没有办法指定我想在 "bingings.xjb" 中用 myNamespace.Member 替换 MemberType?由于此配置,我希望 ObjectFactory.createMemberType 的结果也会发生变化。谢谢。

经过反复试验,我终于找到了一种方法。以下是工作 "bindings.xjb" 文件:

<bindings xmlns="http://java.sun.com/xml/ns/jaxb"
          xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          schemaLocation="example.xsd" node="/xsd:schema" version="2.1">
  <bindings node="./xsd:complexType[@name='MemberType']">
    <class implClass="myNamespace.Member" />
  </bindings>
  <bindings node="//xsd:element[@name='Member']">
    <property name="Members">
      <baseType name="myNamespace.Member" />
    </property>
  </bindings>
</bindings>

生成的ObjectFactory.createMemberType方法不变:

public MemberType createMemberType() {
    return new Member();
}

但是,生成的 Root class 现在具有以下实现:

protected List<myNamespace.Member> members;
public List<myNamespace.Member> getMembers() {
    if (members == null) {
        members = new ArrayList<myNamespace.Member>();
    }
    return this.members;
}

我已验证生成的 JAXB 对象已正确编组和解组。