tbg
tbg

Reputation: 151

jaxb unmarshlling object with list of objects returns the list with one element and all properties null

I have following xml response :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:DealLookupResponse xmlns:ns2="http://www.starstandards.org/webservices/2005/10/transport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:anyType">
    <Deal>
        <CompanyNumber>CN7</CompanyNumber>
        <DealNumber>111</DealNumber>
        <RecordStatus>A</RecordStatus>
        <SalesPersons>
            <SalesPerson>
                <RecordType/>
                <SalesPersonID>CL1</SalesPersonID>
                <Status>A</Status>
                <SaleDate>20140806</SaleDate>
                <SalesPersonName>CLOSER 1</SalesPersonName>
                <IncentiveCommission>0.00</IncentiveCommission>
                <TotalCommission>0.00</TotalCommission>
            </SalesPerson>
        </SalesPersons>
    </Deal>
</ns2:DealLookupResponse>

When I unmarshal this xml to Java Object, I get all values of Deal object but SalesPersons has one element in the list and all the properties of this element are null. What am I missing?

My DealLookupResponse class is

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "deal"
})
@XmlRootElement(name = "DealLookupResponse", namespace="http://www.starstandards.org/webservices/2005/10/transport")

public class DealLookupResponse {

    @XmlElement(name = "Deal", required = false)
    Deal deal;

    public Deal getDeal() {
       return deal;
    }

    public void setDeal(Deal deal) {
       this.deal = deal;
    }
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Deal", propOrder = {
    "companyNumber",
    "dealNumber",
    "recordStatus",
    "salesPersons"
}, namespace = "http://www.starstandards.org/webservices/2005/10/transport")
public class Deal {

    @XmlElement(name="CompanyNumber")
    String companyNumber;

    @XmlElement(name="DealNumber")
    String dealNumber;

    @XmlElement(name="RecordStatus")
    String recordStatus;

    @XmlElementWrapper
    @XmlElement(name="SalesPerson")
    List<SalesPerson> salesPersons;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SalesPerson", propOrder = {
    "recordType",
    "salesPersonID",
    "status",
    "saleDate",
    "salesPersonName",
    "incentiveCommission",
    "totalCommission"
}, namespace = "http://www.starstandards.org/webservices/2005/10/transport")

public class SalesPerson {

   @XmlElement(name="RecordType")
   String recordType;

   @XmlElement(name="SalesPersonID")
   Long salesPersonID;

   @XmlElement(name="Status")
   String status;

   @XmlElement(name="SaleDate")
   Date saleDate;

   @XmlElement(name="SalesPersonName")
   String salesPersonName;

   @XmlElement(name="IncentiveCommission")
   Double incentiveCommission;

   @XmlElement(name="TotalCommission")
   Double totalCommission;

}

My unmarshalling code looks like this :

    JAXBContext jc =  JAXBContext.newInstance(DealLookupResponse.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    DealLookupResponse je = (DealLookupResponse)unmarshaller.unmarshal(xmlInputSource);

Upvotes: 2

Views: 1922

Answers (2)

bdoughan
bdoughan

Reputation: 149017

What You Currently Have

Since you haven't specified a name on the @XmlElementWrapper annotation you wil get the default behaviour.

@XmlElementWrapper
@XmlElement(name="SalesPerson")
List<SalesPerson> salesPersons;

This means it will correspond to the following XML:

<salesPersons>
    <SalesPerson>
    </SalesPerson>
<salesPersons>

How To Fix It

You need to change the @XmlElementWrapper annotation on the salesPersons field to be the following:

@XmlElementWrapper(name="SalesPersons")
@XmlElement(name="SalesPerson")
List<SalesPerson> salesPersons;

Debugging Tip

When you experience problems unmarshalling, populate your object model and then marshal it to XML. Then compare this XML to the XML you are unmarshalling to see if there are any differences.

Upvotes: 3

Xstian
Xstian

Reputation: 8272

Use this XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DealLookupResponse xmlns="http://www.starstandards.org/webservices/2005/10/transport" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xsi:type="xsd:anyType">
    <Deal>
        <CompanyNumber>CN7</CompanyNumber>
        <DealNumber>111</DealNumber>
        <RecordStatus>A</RecordStatus>
        <SalesPersons>
            <SalesPerson>
                <RecordType/>
                <SalesPersonID>CL1</SalesPersonID>
                <Status>A</Status>
                <SaleDate>20140806</SaleDate>
                <SalesPersonName>CLOSER 1</SalesPersonName>
                <IncentiveCommission>0.00</IncentiveCommission>
                <TotalCommission>0.00</TotalCommission>
            </SalesPerson>
        </SalesPersons>
    </Deal>
</DealLookupResponse>

and below classes

DealLookupResponse

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "DealLookupResponse", propOrder = {
    "Deal"
})
@XmlRootElement(name = "DealLookupResponse", namespace="http://www.starstandards.org/webservices/2005/10/transport")
public class DealLookupResponse {


    @XmlElement(required = true)
    Deal Deal;


}

Deal

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "CompanyNumber",
    "DealNumber",
    "RecordStatus",
    "SalesPersons"
})
@XmlRootElement(name = "Deal", namespace="http://www.starstandards.org/webservices/2005/10/transport")
public class Deal {

    @XmlElement(required = true)
    String CompanyNumber;

    @XmlElement(required = true)
    String DealNumber;

    @XmlElement(required = true)
    String RecordStatus;

    @XmlElementWrapper
    @XmlElement(required = true)
    List<SalesPerson> SalesPersons;


}

SalesPerson

@XmlType(name = "SalesPerson", propOrder = {
        "RecordType",
        "RalesPersonID",
        "Status",
        "SaleDate",
        "SalesPersonName",
        "IncentiveCommission",
        "TotalCommission"
}, namespace = "http://www.starstandards.org/webservices/2005/10/transport")

public class SalesPerson {

    @XmlElement(name="RecordType")
    String RecordType;

    @XmlElement(name="SalesPersonID")
    Long RalesPersonID;

    @XmlElement(name="Status")
    String Status;

    @XmlElement(name="SaleDate")
    Date SaleDate;

    @XmlElement(name="SalesPersonName")
    String SalesPersonName;

    @XmlElement(name="IncentiveCommission")
    Double IncentiveCommission;

    @XmlElement(name="TotalCommission")
    Double TotalCommission;
}

Upvotes: 0

Related Questions