Je ne comprends pas pourquoi cette exception JAXB IllegalAnnotationException est levée.

Ceci est mon fichier XML:

      

J’ai fait 2 classes pour l’parsingr (Fields.java et Field.java):

 @XmlRootElement(name = "fields") public class Fields { @XmlElement(name = "field") List fields = new ArrayList(); //getter, setter } 

et

 public class Field { @XmlAtsortingbute(name = "mappedField") Ssortingng mappedField; /getter,setter } 

Mais je reçois cette exception.

 [INFO] com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions [INFO] at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66) ~[na:1.6.0_07] [INFO] at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:422) ~[na:1.6.0_07] [INFO] at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.(JAXBContextImpl.java:270) ~[na:1.6.0_07] 

Je ne comprends pas pourquoi cette exception augmente. L’exception est ici:

 JAXBContext context = JAXBContext.newInstance(Fields.class); 

J’utilise JDK 1.6_0.0.7. Merci.

L’exception est due à votre implémentation JAXB (JSR-222) qui pense qu’il existe deux objects mappés avec le même nom (un champ et une propriété). Il existe plusieurs options pour votre cas d’utilisation:

OPTION 1 – Annoter le champ avec @XmlAccessorType(XmlAccessType.FIELD)

Si vous souhaitez annoter le champ, vous devez spécifier @XmlAccessorType(XmlAccessType.FIELD)

Fields.java:

 package forum10795793; import java.util.*; import javax.xml.bind.annotation.*; @XmlRootElement(name = "fields") @XmlAccessorType(XmlAccessType.FIELD) public class Fields { @XmlElement(name = "field") List fields = new ArrayList(); public List getFields() { return fields; } public void setFields(List fields) { this.fields = fields; } } 

Field.java:

 package forum10795793; import javax.xml.bind.annotation.*; @XmlAccessorType(XmlAccessType.FIELD) public class Field { @XmlAtsortingbute(name = "mappedField") Ssortingng mappedField; public Ssortingng getMappedField() { return mappedField; } public void setMappedField(Ssortingng mappedField) { this.mappedField = mappedField; } } 

OPTION # 2 – Annoter les propriétés

Le type d’ XmlAccessType.PUBLIC par défaut est XmlAccessType.PUBLIC . Cela signifie que par défaut, les implémentations JAXB mapperont les champs publics et les accesseurs vers XML. À l’aide du paramètre par défaut, vous devez annoter les accesseurs publics pour lesquels vous souhaitez remplacer le comportement de mappage par défaut.

Fields.java:

 package forum10795793; import java.util.*; import javax.xml.bind.annotation.*; @XmlRootElement(name = "fields") public class Fields { List fields = new ArrayList(); @XmlElement(name = "field") public List getFields() { return fields; } public void setFields(List fields) { this.fields = fields; } } 

Field.java:

 package forum10795793; import javax.xml.bind.annotation.*; public class Field { Ssortingng mappedField; @XmlAtsortingbute(name = "mappedField") public Ssortingng getMappedField() { return mappedField; } public void setMappedField(Ssortingng mappedField) { this.mappedField = mappedField; } } 

Pour plus d’informations

Je ne comprends pas pourquoi cette exception JAXB IllegalAnnotationException est levée.

### counts of IllegalAnnotationExceptions également le nombre de ### counts of IllegalAnnotationExceptions exception ### counts of IllegalAnnotationExceptions et cela semblait être dû à une hiérarchie de dépendance inappropriée dans mon câblage Spring.

Je l’ai compris en insérant un point d’arrêt dans le code JAXB lors du lancement. Pour moi, il s’agissait de com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check() . Ensuite, j’ai déposé la variable de list qui donne quelque chose comme:

 [org.mortbay.jetty.Handler is an interface, and JAXB can't handle interfaces. this problem is related to the following location: at org.mortbay.jetty.Handler at public org.mortbay.jetty.Handler[] org.mortbay.jetty.handler.HandlerCollection.getHandlers() at org.mortbay.jetty.handler.HandlerCollection at org.mortbay.jetty.handler.ContextHandlerCollection at com.mprew.ec2.commons.server.LocalContextHandlerCollection at private com.mprew.ec2.commons.server.LocalContextHandlerCollection com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection.arg0 at com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection, org.mortbay.jetty.Handler does not have a no-arg default constructor.] .... 

Le does not have a no-arg default constructor me semblait être trompeur. Peut-être que je ne comprenais pas ce que l’exception disait. Mais cela indiquait qu’il y avait un problème avec ma LocalContextHandlerCollection . J’ai supprimé une boucle de dépendance et l’erreur effacée.

J’espère que cela sera utile aux autres.

En effet, par défaut, lorsque Jaxb sérialise un pojo, il recherche les annotations sur les membres publics (getters ou setters) des propriétés. Mais, vous fournissez des annotations sur les champs. ainsi, vous pouvez soit modifier et définir les annotations sur des setters ou des accesseurs de propriétés, soit définir le champ XmlAccessortype sur.

Option 1::

 @XmlRootElement(name = "fields") @XmlAccessorType(XmlAccessType.FIELD) public class Fields { @XmlElement(name = "field") List fields = new ArrayList(); //getter, setter } @XmlAccessorType(XmlAccessType.FIELD) public class Field { @XmlAtsortingbute(name = "mappedField") Ssortingng mappedField; //getter,setter } 

Option 2::

 @XmlRootElement(name = "fields") public class Fields { List fields = new ArrayList(); @XmlElement(name = "field") public List getFields() { } //setter } @XmlAccessorType(XmlAccessType.FIELD) public class Field { Ssortingng mappedField; @XmlAtsortingbute(name = "mappedField") public Ssortingng getMappedField() { } //setter } 

Pour plus de détails et de détails, consultez la documentation suivante du JDK: http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html

L’un des éléments suivants peut provoquer l’exception:

  1. Ajoutez un constructeur public vide à votre classe Fields. JAXB utilise la reflection pour charger vos classes. C’est pourquoi l’exception est levée.
  2. Ajoutez un getter et un setter séparés pour votre liste.

J’ai déjà reçu ce message après avoir pensé à mettre @XmlTransient sur un champ que je n’avais pas besoin de sérialiser, dans une classe annotée avec @XmlAccessorType(XmlAccessType.NONE) .

Dans ce cas, la suppression de XmlTransient résolu le problème. Je ne suis pas un expert de JAXB, mais je pense que, parce que AccessType.NONE indique qu’aucune sérialisation automatique ne doit être effectuée (c.-à-d. Que les champs doivent être spécifiquement annotés pour les sérialiser), ce qui rend XmlTransient illégal, son seul but étant d’exclure un champ de l’auto. -sérialisation.

J’avais le même problème, je renvoyais un haricot de spring en tant qu’object ResponseBody. Quand j’ai rendu un object créé par un nouveau, tout était bon.

J’avais le même problème

Ma question

 Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Two classes have the same XML type name "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearch". Use @XmlType.name and @XmlType.namespace to assign different names to them. this problem is related to the following location: at katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch at public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearch(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch) at katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory this problem is related to the following location: at cpq_tns_kat_getgroupsearch.KatGetgroupsearch Two classes have the same XML type name "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearchResponse0". Use @XmlType.name and @XmlType.namespace to assign different names to them. this problem is related to the following location: at katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0 at public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearchResponse0(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0) at katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory this problem is related to the following location: at cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0 

Modifié pour le résoudre sont ci-dessous

Je change le nom respectif en espace de noms

 @XmlAccessorType(XmlAccessType.FIELD) @XmlType(**name** = "Kat_getgroupsearch", propOrder = { @XmlAccessorType(XmlAccessType.FIELD) @XmlType(namespace = "Kat_getgroupsearch", propOrder = { @XmlAccessorType(XmlAccessType.FIELD) @XmlType(**name** = "Kat_getgroupsearchResponse0", propOrder = { @XmlAccessorType(XmlAccessType.FIELD) @XmlType(namespace = "Kat_getgroupsearchResponse0", propOrder = { 

Pourquoi?

Comme écrit dans le journal des erreurs, deux classes ont le même nom. Nous devons donc utiliser un espace de noms, car ces derniers sont utilisés pour fournir des éléments et des atsortingbuts portant un nom unique dans un document XML.

Toutes les options ci-dessous ont fonctionné pour moi.

Option 1: Annotation pour FIELD au niveau classe et champ avec les méthodes getter / setter

  @XmlRootElement(name = "fields") @XmlAccessorType(XmlAccessType.FIELD) public class Fields { @XmlElement(name = "field") List fields = new ArrayList(); //getter, setter } 

Option 2: Aucune annotation pour FIELD au niveau de la classe (@XmlAccessorType (XmlAccessType.FIELD) et avec la seule méthode getter. L’ajout de la méthode Setter enverra l’erreur car nous n’incluons pas l’annotation dans ce cas. N’oubliez pas, setter n’est pas requirejs lorsque vous définir explicitement les valeurs dans votre fichier XML.

 @XmlRootElement(name = "fields") public class Fields { @XmlElement(name = "field") List fields = new ArrayList(); //getter } 

Option 3: Annotation à la méthode getter uniquement. Rappelez-vous que nous pouvons également utiliser la méthode setter ici car nous ne faisons aucune annotation de niveau FIELD dans ce cas.

 @XmlRootElement(name = "fields") public class Fields { List fields = new ArrayList(); @XmlElement(name = "field") //getter //setter } 

J’espère que cela vous aidera!