Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB : 2 counts of IllegalAnnotationExceptions

Tags:

java

xml

jaxb

This is my Parser class

public class Test {
    public static void main(String args[]) throws Exception {

        File file = new File("D:\\Test.xml");
        JAXBContext jaxbContext = JAXBContext.newInstance(MyOrder.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        MyOrder customer = (MyOrder) jaxbUnmarshaller.unmarshal(file);
        System.out.println(customer.getOrder().getSide());
    }
}

This is MyOrder.java file

@XmlRootElement(name = "BXML")
public class MyOrder {
    @XmlElement(name = "Bag")
    protected Order order;

    public MyOrder() {

    }
    @XmlAttribute
    public Order getOrder() {
        return order;
    }
    public void setOrder(Order order) {
        this.order = order;
    }
}

This is my Domain Object (Order.java )

@XmlRootElement(name = "BXML")
public class Order {

    public Order() {

    }

    @XmlAttribute(name = "Side")
    protected BigInteger Side;

    @XmlValue
    public BigInteger getSide() {
        return Side;
    }

    public void setSide(BigInteger side) {
        Side = side;
    }
}

This is the exception that I am getting when I tried to run the program

Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
@XmlAttribute/@XmlValue need to reference a Java type that maps to text in XML.
    this problem is related to the following location:
        at public com.Order com.MyOrder.getOrder()
        at com.MyOrder
Class has two properties of the same name "order"
    this problem is related to the following location:
        at public com.Order com.MyOrder.getOrder()
        at com.MyOrder
    this problem is related to the following location:
        at protected com.Order com.MyOrder.order
        at com.MyOrder
like image 289
Pawan Avatar asked Apr 03 '12 10:04

Pawan


3 Answers

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]]]]]
like image 124
Ashish Jha Avatar answered Nov 04 '22 21:11

Ashish Jha


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").

like image 13
Brant Olsen Avatar answered Nov 04 '22 19:11

Brant Olsen


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.

like image 2
BinDev Avatar answered Nov 04 '22 21:11

BinDev