Reputation: 151
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
Reputation: 149017
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>
You need to change the @XmlElementWrapper
annotation on the salesPersons
field to be the following:
@XmlElementWrapper(name="SalesPersons")
@XmlElement(name="SalesPerson")
List<SalesPerson> salesPersons;
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
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