Search code examples
javajaxbwsdl

JaxB takes into account maxOccurs="unbounded" and it it is set, creates the inner element as list for sequence, otherwise just single field


I have such types in WSDL, the only difference is maxOccurs="unbounded", however, the Java classes generated are different:

        <xs:complexType name="TypeGetPaymentDetailsAdditionRequest">
            <xs:sequence>
                <xs:element name="PaymentDetails"
                            type="tns:TypeGetPaymentDetailAdditionRequest"/>
            </xs:sequence>
        </xs:complexType>
        <xs:complexType name="TypeGetPaymentDetailsRequest">
            <xs:sequence>
                <xs:element name="PaymentDetails"
                            type="tns:TypeGetPaymentDetailRequest"
                            maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>

The Java classes, the first one have the List<> inside, while another doesn't.

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "TypeGetPaymentDetailsRequest",
    propOrder = {"paymentDetails"}
)
public class TypeGetPaymentDetailsRequest {
    @XmlElement(
        name = "PaymentDetails",
        required = true
    )
    protected List<TypeGetPaymentDetailRequest> paymentDetails;

    public TypeGetPaymentDetailsRequest() {
    }

    public List<TypeGetPaymentDetailRequest> getPaymentDetails() {
        if (this.paymentDetails == null) {
            this.paymentDetails = new ArrayList();
        }

        return this.paymentDetails;
    }
}

and

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
    name = "TypeGetPaymentDetailsAdditionRequest",
    propOrder = {"paymentDetails"}
)
public class TypeGetPaymentDetailsAdditionRequest {
    @XmlElement(
        name = "PaymentDetails",
        required = true
    )
    protected TypeGetPaymentDetailAdditionRequest paymentDetails;

    public TypeGetPaymentDetailsAdditionRequest() {
    }

    public TypeGetPaymentDetailAdditionRequest getPaymentDetails() {
        return this.paymentDetails;
    }

    public void setPaymentDetails(TypeGetPaymentDetailAdditionRequest value) {
        this.paymentDetails = value;
    }

}

How one can force to make paymentDetails field to be a List<> in the second case too?

JAXB version:

jaxb "com.sun.xml.bind:jaxb-xjc:2.1.7"

Solution

  • Add maxOccurs="unbounded" to the other attribute too:

      <xs:complexType name="TypeGetPaymentDetailsAdditionRequest">
                <xs:sequence>
                    <xs:element name="PaymentDetails"
                          type="tns:TypeGetPaymentDetailAdditionRequest" 
                          maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>
            <xs:complexType name="TypeGetPaymentDetailsRequest">
                <xs:sequence>
                    <xs:element name="PaymentDetails"
                                type="tns:TypeGetPaymentDetailRequest"
                                maxOccurs="unbounded"/>
                </xs:sequence>
            </xs:complexType>