Jaxb unmarshalling returns null and single objects

java, jaxb, xml

Solution

Your Java classes don't match the structure of your XML file. As @Rhayene already commented, you need separate Java classes for `AccountInfo` and `Account`.

`AccountInfo` will contain only a list of `Account`s:

@XmlRootElement(name = "AccountInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class AccountInfo {

    @XmlElement(name = "Account")
    private List<Account> accounts;

    // + constructors, getters, setters
}

`Account` will contain all the properties which you had in in `AccountInfo` before. (By the way: You should also follow the convention of field names beginning with lower-case letter. This will not break anything because the XML names are still specified by `@XmlElement`)

@XmlAccessorType(XmlAccessType.FIELD)
public class Account {

    @XmlElement(name = "FirstName")
    private String firstName;
    @XmlElement(name = "LastName")
    private String lastName;
    @XmlElement(name = "Country")
    private String country;
    @XmlElement(name = "PhoneNumber")
    private String phoneNumber;
    @XmlElement(name = "Email")
    private String email;
    @XmlElement(name = "Password")
    private String password;
    @XmlElement(name = "PaymentMethod")
    private PaymentMethod paymentMethod;

    // + constructors, getters, setters
}

Problem

I'm trying to unmarshal an a xml file. Here's my files below. XML file ``` <AccountInfo> <Account> <FirstName>FirstName1</FirstName> <LastName>LastName1</LastName> <Country>US</Country> <PhoneNumber>2022023111</PhoneNumber> <Email>test@test.com</Email> <Password>1222433123</Password> <PaymentMethod> <CardNumber>4111111111111111</CardNumber> <Month>12</Month> <Year>2017</Year> <CVV>098</CVV> <StreetAddress>test</StreetAddress> <Town>test</Town> <State>Virginia</State> <ZipCode>12365</ZipCode> <Country>US</Country> </PaymentMethod> </Account> <Account> <FirstName>FirstName1</FirstName> <LastName>LastName1</LastName> <Country>US</Country> <PhoneNumber>2022023111</PhoneNumber> <Email>test@test.com</Email> <Password>1222433123</Password> <PaymentMethod> <CardNumber>4111111111111111</CardNumber> <Month>12</Month> <Year>2017</Year> <CVV>098</CVV> <StreetAddress>test</StreetAddress> <Town>test</Town> <State>Virginia</State> <ZipCode>12365</ZipCode> <Country>US</Country> </PaymentMethod> </Account> </AccountInfo> ``` JaxbHelper.java ``` public static <T> T unmarshal(InputStream file, Class<T> unmarshalClass) throws JAXBException { JAXBContext jaxbContext = JAXBContext.newInstance(unmarshalClass); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); T object = (T) jaxbUnmarshaller.unmarshal(file); return object; } ``` AccountInfo.java ``` @XmlRootElement(name = "AccountInfo") @XmlAccessorType(XmlAccessType.FIELD) @XmlSeeAlso({PaymentMethod.class}) public class AccountInfo { @XmlElement(name = "FirstName") private String FirstName; @XmlElement(name = "LastName") private String LastName; @XmlElement(name = "Country") private String Country; @XmlElement(name = "PhoneNumber") private String PhoneNumber; @XmlElement(name = "Email") private String Email; @XmlElement(name = "Password") private String Password; @XmlElement(name = "PaymentMethod") private PaymentMethod paymentMethod; public AccountInfo() { setFirstName(null); setLastName(null); setCountry(null); setPhoneNumber(null); setEmail(null); setPassword(null); setPaymentMethod(null); } public AccountInfo(String FirstName, String LastName, String Country, String PhoneNumber, String Email, String Password, PaymentMethod paymentMethod) { setFirstName(FirstName); setLastName(LastName); setCountry(Country); setPhoneNumber(PhoneNumber); setEmail(Email); setPassword(Password); setPaymentMethod(paymentMethod); } public String getFirstName() { return FirstName; } public void setFirstName(String firstName) { this.FirstName = firstName; } public String getLastName() { return LastName; } public void setLastName(String lastName) { this.LastName = lastName; } public String getCountry() { return Country; } public void setCountry(String country) { this.Country = country; } public String getPhoneNumber() { return PhoneNumber; } public void setPhoneNumber(String phoneNumber) { this.PhoneNumber = phoneNumber; } public String getEmail() { return Email; } public void setEmail(String email) { this.Email = email; } public String getPassword() { return Password; } public void setPassword(String password) { this.Password = password; } public PaymentMethod getPaymentMethod() { return paymentMethod; } public void setPaymentMethod(PaymentMethod paymentMethod) { this.paymentMethod = paymentMethod; } } ``` How I consume the unmarshal ``` List<T> accountInfo = (List<T>)ProcessClassHelper.unmarshal(xmlfile, Class.forName(Constants.ClassesDir +className)); ``` I'm unsure what's causing the issue but the object is returned as single object even though there are multiple accounts and the returned data are null. Thanks in advance.

Original source

Related problems