I do code generation from XSD (using JAXB). I have one superclass and several subclasses. One of the superclass' properties (let's say, prop
) has type A
. I also have types B extends A
and C extends A
(defined in XSD). The superclass' schema defines an element of type A
, which is inherited by the subclasses. I want to use types B
and C
instead of A
in the subclasses.
<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>
The generated Superclass.java
will have List<A> prop
. For example, I want the prop
to be overriden with type List<B>
in the Subclass1.java
and with List<C>
in Subclass2.java
. The primary goal is to have the prop
in the superclass, but to use other (compatible) types in the subclasses.
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!)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With