java - 如何覆盖从父复杂类型继承的元素类型?
问题描述
我从 XSD 生成代码(使用 JAXB)。我有一个超类和几个子类。超类的属性之一(比如说,prop
)有 type A
。我也有类型B extends A
和C extends A
(在 XSD 中定义)。超类的模式定义了一个类型为 的元素A
,它被子类继承。我想使用类型B
而C
不是A
在子类中。
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="A" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="Subclass1">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someAttribute" type="xsd:string"/>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="Subclass2">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someOtherAttribute" type="xsd:int"/>
</xsd:complexContent>
</xsd:complexType>
生成的Superclass.java
将具有List<A> prop
. 例如,我希望用in和in的prop
类型覆盖。主要目标是在超类中拥有 ,但在子类中使用其他(兼容的)类型。List<B>
Subclass1.java
List<C>
Subclass2.java
prop
解决方案
I find no samples, where xsd elements(/complex types) are extended & overridden like that, but you can do it, when Subclass1
and Subclass2
(and Superclass
) reside in different "definitions". You would xs:override
Superclass
in both of the "sub-xsds" (one with B and one with C type), and then extend them accordingly:
parent.xsd:
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="A" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
sub1.xsd:
<xs:override schemaLocation="parent.xsd">
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="B" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xs:override>
<!-- and just : -->
<xsd:complexType name="Subclass1">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someAttribute" type="xsd:string"/>
</xsd:complexContent>
</xsd:complexType>
and sub2.xsd:
<xs:override schemaLocation="parent.xsd">
<xsd:complexType name="Superclass">
<xsd:sequence>
<xsd:element name="prop" type="C" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xs:override>
<xsd:complexType name="Subclass2">
<xsd:complexContent>
<xsd:extension base="Superclass"/>
<xsd:attribute name="someOtherAttribute" type="xsd:int"/>
</xsd:complexContent>
</xsd:complexType>
It must be in different definitions, because I don't know how to overcome the "name clash" (Superclass =? Superclass), but maybe someone has an idea? ...shows a better/n alternative way.
This solution is as easy/complex as "defining SuperclassB and SuperclassC". (questioning the necessity of Superclass!)