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
生成了我的实施实例。但是生成的Root
class的实现包括:
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 对象已正确编组和解组。
我正在使用 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
生成了我的实施实例。但是生成的Root
class的实现包括:
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 对象已正确编组和解组。