web-dev-qa-db-fra.com

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

Ceci est mon fichier XML: 

<fields>
    <field mappedField="Num">
    </field>

    <field mappedField="Type">      
    </field>    
</fields>

J'ai fait 2 classes pour l'analyser (Fields.Java et Field.Java): 

@XmlRootElement(name = "fields")
public class Fields {

    @XmlElement(name = "field")
    List<Field> fields = new ArrayList<Field>();
        //getter, setter
}

et

public class Field {

    @XmlAttribute(name = "mappedField")
    String 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.<init>(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.

23
MyTitle

Cette exception est due à votre implémentation JAXB (JSR-222) qui pense qu’il existe deux objets 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<Field> fields = new ArrayList<Field>();

    public List<Field> getFields() {
        return fields;
    }

    public void setFields(List<Field> fields) {
        this.fields = fields;
    }

}

Field.Java:

package forum10795793;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

    @XmlAttribute(name = "mappedField")
    String mappedField;

    public String getMappedField() {
        return mappedField;
    }

    public void setMappedField(String mappedField) {
        this.mappedField = mappedField;
    }

}

OPTION # 2 - Annoter les propriétés

Le type d'accès 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<Field> fields = new ArrayList<Field>();

    @XmlElement(name = "field")
    public List<Field> getFields() {
        return fields;
    }

    public void setFields(List<Field> fields) {
        this.fields = fields;
    }

}

Field.Java:

package forum10795793;

import javax.xml.bind.annotation.*;

public class Field {

    String mappedField;

    @XmlAttribute(name = "mappedField")
    public String getMappedField() {
        return mappedField;
    }

    public void setMappedField(String mappedField) {
        this.mappedField = mappedField;
    }

}

Pour plus d'informations

47
Blaise Doughan

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

J'obtenais aussi l'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, c'était à com.Sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(). Ensuite, j'ai vidé la variable 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 m'a semblé ê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.

Espérons que cela sera utile aux autres.

20
Gray

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 getters 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<Field> fields = new ArrayList<Field>();
        //getter, setter
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

       @XmlAttribute(name = "mappedField")
       String mappedField;
       //getter,setter
}

Option 2::

@XmlRootElement(name = "fields")
public class Fields {

        List<Field> fields = new ArrayList<Field>();

        @XmlElement(name = "field")
        public List<Field> getFields() {

        }

        //setter
}

@XmlAccessorType(XmlAccessType.FIELD)
public class Field {

       String mappedField;

       @XmlAttribute(name = "mappedField")
       public String getMappedField() {

       }

        //setter
}

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

8
Love Hasija

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

  1. Ajoutez un constructeur public vide à votre classe Fields, JAXB utilise la réflexion Pour charger vos classes. C'est pourquoi l'exception est levée.
  2. Ajoutez un getter et un setter séparés à votre liste.
6
GingerHead

Une fois, j'ai reçu ce message après avoir pensé que 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 a 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 -sérialisation.

1
DVA

J'avais le même problème, je renvoyais un haricot de printemps en tant qu'objet ResponseBody. Quand j'ai rendu un objet créé par new, tout allait bien.

0
BillFromHawaii

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<Field> fields = new ArrayList<Field>();
            //getter, setter
    }

Option 2: Aucune annotation pour FIELD au niveau de la classe (@XmlAccessorType (XmlAccessType.FIELD) et avec la seule méthode getter. Ajouter une méthode Setter lève l'erreur car nous n'incluons pas l'annotation dans ce cas. définir explicitement les valeurs dans votre fichier XML.

@XmlRootElement(name = "fields")
    public class Fields {

        @XmlElement(name = "field")
        List<Field> fields = new ArrayList<Field>();
            //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<Field> fields = new ArrayList<Field>();

        @XmlElement(name = "field")
        //getter

        //setter
    }

J'espère que cela vous aide!

0
mannedear

pour moi, cette erreur a été causée par un champ faussement déclaré public et non privé.

0
bluscreen

J'avais le même problème

Mon numéro  

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

Les modifications apportées 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 Les espaces de noms XML sont utilisés pour fournir des éléments et des attributs portant un nom unique dans un document XML.

0
rewrihitesh