JAXB : 2 counts of IllegalAnnotationExceptions

You can see the below sample code to generate Java Object from given XML.It is working fine in my system.

customer.xml

<?xml version="1.0" encoding="UTF-8"?>
<company>
    <customer id="100">
        <age>25</age>
        <name>Ram</name>
        <Address>
            <city>Bangalore</city>
            <country>India</country>
        </Address>
        <Address>
            <city>Patna</city>
            <country>India</country>
        </Address>
    </customer>

    <customer id="200">
        <age>26</age>
        <name>Ashu</name>
        <Address>
            <city>Delhi</city>
            <country>India</country>
        </Address>
        <Address>
            <city>Madhubani</city>
            <country>India</country>
        </Address>
    </customer>
</company>

Company.java

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

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

    @XmlElement(name="customer")
    private List<Costumer> custList;
    //

    public List<Costumer> getCustList() {
        return custList;
    }

    public void setCustList(List<Costumer> custList) {
        this.custList = custList;
    }
    //

    @Override
    public String toString() {
        return "Company [custList=" + custList + "]";
    }
}

Costumer.java

@XmlAccessorType(XmlAccessType.FIELD)
class Costumer {
    @XmlElement(name="name")
    private String name;

    @XmlElement(name="age")
    private int age;

    @XmlElement(name="id")
    private int id;

    @XmlElement(name="Address")
    private List<Address> addressList;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public List<Address> getAddressList() {
        return addressList;
    }

    public void setAddressList(List<Address> addressList) {
        this.addressList = addressList;
    }

    @Override
    public String toString() {
        return "Customer [name=" + name + ", age=" + age + ", id=" + id + ", addressList=" + addressList + "]";
    }
}

Address.java

@XmlAccessorType(XmlAccessType.FIELD)
class Address {
    @XmlElement(name="city")
    private String city;

    @XmlElement(name="country")
    private String country;
    //
    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }
    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
    //
    @Override
    public String toString() {
        return "Address [city=" + city + ", country=" + country + "]";
    }
}

TestMain.java

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class TestMain {

    public static void main(String[] args) {

        String xmlPath = "C:\\" + File.separator  + "customer.xml";

        try {

            File file = new File(xmlPath);

            JAXBContext jaxbContext = JAXBContext.newInstance(new Class[] {Company.class,Address.class,Costumer.class});
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            Company customer = (Company) jaxbUnmarshaller.unmarshal(file);
            System.out.println(customer);

          } catch (JAXBException e) {
            e.printStackTrace();
          }
    }
}
Outout:
Company [custList=[Customer [name=Ram, age=25, id=0, addressList=[Address [city=Bangalore, country=India], Address [city=Patna, country=India]]], Customer [name=Ashu, age=26, id=0, addressList=[Address [city=Delhi, country=India], Address [city=Madhubani, country=India]]]]]

For the @XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML. issue you need to change your initialization of JAXBContext to the following:

JAXBContext jaxbContext = JAXBContext.newInstance(MyOrder.class, Order.class);

For the Class has two properties of the same name "order" issue, you need to change the definition of protected Order order; to private Order order;.

Also, you want to change the @XmlRootElement(name = "BXML") of your Order class to @XmlRootElement(name = "Order").


This is because the sub-elements of that class you are creating JAXBcontext instance ,doesn't have the same name as of the element names defined inside it.

Example:

@XmlType(name = "xyz", propOrder = { "a", "b", "c", "d" })
@XmlRootElement(name = "testClass")
public class TestClass
{

  @XmlElement(required = true)
  protected Status status;
  @XmlElement(required = true)
  protected String mno;
  @XmlElement(required = true)
}

In the above class you don't have "xyz" , but if you will put the property name that is not available JAXBContext instantiation throws IlligalAnnotationException.

Tags:

Xml

Jaxb