Vous pourriez penser que le problème suivant est très simple, mais je ne sais pas ce que j'ai mal fait ici. Je pense que j'ai ajouté les dépendances requises. N'est-ce pas?
Quelqu'un pourrait-il me dire s'il vous plaît ce qui ne va pas ici?
Exception in thread "main" Java.lang.NoClassDefFoundError: com/Sun/xml/bind/v2/model/annotation/AnnotationReader
at Java.lang.ClassLoader.defineClass1(Native Method)
at Java.lang.ClassLoader.defineClass(ClassLoader.Java:760)
at Java.security.SecureClassLoader.defineClass(SecureClassLoader.Java:142)
at Java.net.URLClassLoader.defineClass(URLClassLoader.Java:467)
at Java.net.URLClassLoader.access$100(URLClassLoader.Java:73)
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:368)
at Java.net.URLClassLoader$1.run(URLClassLoader.Java:362)
at Java.security.AccessController.doPrivileged(Native Method)
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:361)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:331)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
at Java.lang.Class.getDeclaredMethods0(Native Method)
at Java.lang.Class.privateGetDeclaredMethods(Class.Java:2701)
at Java.lang.Class.privateGetMethodRecursive(Class.Java:3048)
at Java.lang.Class.getMethod0(Class.Java:3018)
at Java.lang.Class.getMethod(Class.Java:1784)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.Java:242)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.Java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.Java:441)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.Java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.Java:584)
at com.misc.common.ReadXMLFileJaxb.main(ReadXMLFileJaxb.Java:14)
Caused by: Java.lang.ClassNotFoundException: com.Sun.xml.bind.v2.model.annotation.AnnotationReader
at Java.net.URLClassLoader.findClass(URLClassLoader.Java:381)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:424)
at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:331)
at Java.lang.ClassLoader.loadClass(ClassLoader.Java:357)
... 23 more
Book.Java
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
@XmlAttribute
private String firstName;
@XmlElement
private String lastName;
@XmlElement
private String age;
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 getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Book [firstName=" + firstName + ", lastName=" + lastName+ ", age=" + age + "]";
}
}
ReadXMLFileJaxb.Java
public class ReadXMLFileJaxb {
public static void main(String[] args) {
File file = new File(ReadXMLFileDOM.class.getClassLoader().getResource("book.xml").getFile());
try {
JAXBContext context = JAXBContext.newInstance(Book.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Book book = (Book) unmarshaller.unmarshal(file);
System.out.println(book.toString());
} catch (JAXBException e) {
System.out.println(e.getMessage());
}
}
}
Mon book.xml
<?xml version="1.0"?>
<book>
<person>
<first>Kiran</first>
<last>Pai</last>
<age>22</age>
</person>
<person>
<first>Bill</first>
<last>Gates</last>
<age>46</age>
</person>
<person>
<first>Steve</first>
<last>Jobs</last>
<age>40</age>
</person>
</book>
pom.xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<Java.version>1.8</Java.version>
</properties>
<dependencies>
<!-- JAXB -->
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.12</version>
</dependency>
</dependencies>
Voir lien: Pourquoi AnnotationReader a-t-il été supprimé de la mise en œuvre de référence JAXB? , vous devez simplement utiliser les dépendances ci-dessous:
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>com.Sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.2.11</version>
</dependency>
Vous avez besoin de refactoriser un peu le code. On dirait aussi que vous n’avez pas créé les mêmes champs de nom que la classe de modèle, cela devrait être comme ci-dessous:
@XmlRootElement(name="Person")
@XmlAccessorType(XmlAccessType.FIELD)
public class Person {
@XmlElement
private String first;
@XmlElement
private String last;
@XmlElement
private String age;
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getLast() {
return last;
}
public void setLast(String last) {
this.last = last;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person [first=" + first + ", last=" + last + ", age=" + age + "]";
}
}
Book.Java
@XmlRootElement(name="book")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
private List<Person> person = new ArrayList<Person>();
public List<Person> getPerson() {
return person;
}
public void setPerson(List<Person> person) {
this.person = person;
}
}
ReadXMLFileJaxb.Java
public class ReadXMLFileJaxb {
public static void main(String[] args) {
File file = new File(ReadXMLFileDOM.class.getClassLoader().getResource("book.xml").getFile());
try {
JAXBContext context = JAXBContext.newInstance(Book.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
Book book = (Book) unmarshaller.unmarshal(file);
System.out.println(book.getPerson().size());
for (int i = 0; i < book.getPerson().size(); i++) {
System.out.println("------------");
System.out.println(book.getPerson().get(i).getFirst());
System.out.println(book.getPerson().get(i).getLast());
System.out.println(book.getPerson().get(i).getAge());
}
} catch (JAXBException e) {
System.out.println(e.getMessage());
}
}
}
La sortie ci-dessous, je vois:
3
------------
Kiran
Pai
22
------------
Bill
Gates
46
------------
Steve
Jobs
40
Bien que Issue soit très ancien mais toujours en train de répondre. La cause première est que com.Sun.xml.bind est obsolète maintenant. org.glassfish.jaxb est la dernière implémentation de référence de l'API JAXB. Utiliser ci-dessous la dépendance de maven JAXB RI résoudrait le problème.
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.2.11</version>
</dependency>
Vous semblez l'exécuter dans l'IDE. Pour des raisons étranges, bien que les classes JAXB soient incluses dans le fichier rt.jar de JRE,
➜ lib jar tvf rt.jar| grep AnnotationReader
4199 Fri Jan 29 15:35:18 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/AbstractInlineAnnotationReaderImpl.class
3140 Fri Jan 29 15:35:14 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/AnnotationReader.class
442 Fri Jan 29 15:35:14 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/RuntimeAnnotationReader.class
9846 Fri Jan 29 15:35:22 PST 2016 com/Sun/xml/internal/bind/v2/model/annotation/RuntimeInlineAnnotationReader.class
1217 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$1.class
1332 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$2.class
1278 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$3.class
1166 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader$4.class
3563 Fri Jan 29 15:35:26 PST 2016 com/Sun/xml/internal/ws/model/ReflectAnnotationReader.class
ils ne sont pas disponibles pour votre application au moment de l'exécution.
Cependant, si je lance l'application de cette façon:
➜ target Java -cp ./classes com.misc.common.ReadXMLFileJaxb
Book [firstName=null, lastName=Blo, age=33]
c’est-à-dire qu’à partir de la ligne de commande utilisant la structure Maven standard, il semble fonctionner.
Votre book.xml est un peu faux, je crois. Il contient un élément person
incorporé, contrairement à Book.Java. Vous voudrez peut-être résoudre ce problème.