JAXB List of Choice

11,824

You can use the Simplify plugin from JAXB2 Basics. It can simplify @XmlElements and @XmlElementRefs properties, which makes things a lot easier, if you don't really care about the order. Here's an example (excerpt from the documentation):

Consider the following choice:

<xs:complexType name="typeWithReferencesProperty">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="a" type="someType"/>
        <xs:element name="b" type="someType"/>
    </xs:choice> 
</xs:complexType>

This will normally generate a property like:

@XmlElementRefs({
    @XmlElementRef(name = "a", type = JAXBElement.class),
    @XmlElementRef(name = "b", type = JAXBElement.class)
})
protected List<JAXBElement<SomeType>> aOrB;

You can use the simplify:as-element-property element to remodel this complex property as two element properties or simplify:as-reference-property as two reference properties.

Not that in the case of a reference property, you have to customize one of the xs:element and not the xs:choice.

<xs:complexType name="typeWithReferencesProperty">
    <xs:choice maxOccurs="unbounded">
        <xs:element name="a" type="someType">
            <xs:annotation>
                <xs:appinfo>
                    <simplify:as-element-property/>
                </xs:appinfo>
            </xs:annotation>
        </xs:element>
        <xs:element name="b" type="someType"/>
    </xs:choice> 
</xs:complexType>

Results in:

@XmlElement(name = "a")
protected List<SomeType> a;
@XmlElement(name = "b")
protected List<SomeType> b;
Share:
11,824
olek
Author by

olek

Updated on July 02, 2022

Comments

  • olek
    olek almost 2 years

    I have following schema

    <complexType name="BookShelf">
       <sequence>
          <element name="newBook" type="string" minOccurs="0" maxOccurs="unbounded"/>
          <element name="oldBook" type="string" minOccurs="0" maxOccurs="unbounded"/>
       </sequence>
    </complexType>
    

    XJC generates BookShelf class with two lists, one for newBook and one for oldBook. Excellent!

    Now I want books to appear in any order. So I rewrite my schema to:

    <complexType name="BookShelf">
       <sequence>
          <choice minOccurs="0" maxOccurs="unbounded">
             <element name="newBook" type="string"/>
             <element name="oldBook" type="string"/>
          </choice>
       </sequence>
    </complexType>
    

    But now XJC generates BookShelf with only one list newBookOrOldBook of type List<JAXBElement<String>>.

    I don't care about the order in which books appear and I want to allow XML writer to specify books in any order he\she wishes, but I still want books of each type as List in generated BookShelf class. Is there any way I can achieve this?