繁体   English   中英

JAXB绑定将全局类型替换为实现类

[英]JAXB Bindings Globally Replace Type with Implementing Class

我正在使用JAXB从XSD生成代码。 我有一个外部绑定文件,用于定义XSD类型之一的实现类型(使用class tag / implClass属性)。 当我这样做时,将修改生成的ObjectFactory以返回指定实现类的实例。 但是,生成的类仍声明具有生成的基础类型的成员。 有什么方法可以使生成的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类之后,我得到一个ObjectFactory类,其中包括以下方法:

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

因此,工厂正在为MemberType正确生成我的实现的实例。 但是,生成的Root类的实现包括:

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类现在具有以下实现:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM