I started to learn JAXB from Vogella tutorial site. I changed the package and project name, and running the example generated following exception.
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions Class has two properties of the same name "bookList" this problem is related to the following location: at public java.util.ArrayList com.xmlservice.jaxb.model.Bookstore.getBookList() at com.xmlservice.jaxb.model.Bookstore this problem is related to the following location: at private java.util.ArrayList com.xmlservice.jaxb.model.Bookstore.bookList at com.xmlservice.jaxb.model.Bookstore at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(Unknown Source) at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(Unknown Source) at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) at com.sun.xml.internal.bind.v2.ContextFactory.createContext(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at javax.xml.bind.ContextFinder.newInstance(Unknown Source) at javax.xml.bind.ContextFinder.find(Unknown Source) at javax.xml.bind.JAXBContext.newInstance(Unknown Source) at javax.xml.bind.JAXBContext.newInstance(Unknown Source) at com.xmlservice.jaxb.model.BookMain.main(BookMain.java:43)
Solution: After some googling I figured out, that I have to move annotation to the getter method. That solves above exception.
The Bookstore.java will be look like this:
package com.xmlservice.jaxb.model;
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(namespace = "com.xmlservice.jaxb.model")
public class Bookstore {
private ArrayList<Book> bookList;
private String name;
private String location;
@XmlElementWrapper(name = "bookList")
@XmlElement(name = "book")
public ArrayList<Book> getBookList() {
return bookList;
}
public void setBookList(ArrayList<Book> bookList) {
this.bookList = bookList;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
Hi Thair,
What you have mentioned is one way to avoid the exception.
In general, JAXB looks for public accessor methods. If you are going to place the annotation on a field, make sure that you mention the access type as this @XmlAccessorType(XmlAccessType.FIELD).
I had faced a similar issue while developing RESTFul services in my local environment.
Happy coding.
~cheers,
Noted. So I have to add another annotation on every public accessor.
Thank you very much for help.