Je ne comprends pas pourquoi ce JAXB IllegalAnnotationException est levée
C'est mon fichier XML:
<fields>
<field mappedField="Num">
</field>
<field mappedField="Type">
</field>
</fields>
J'ai fait les 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 bénéficier de 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 s'élève. Exception est ici:
JAXBContext context = JAXBContext.newInstance(Fields.class);
Je utiliser le JDK 1.6_0.0.7. Merci.
- Pourriez-vous essayer de remplacer votre nom d'attribut? Il se pourrait que la
field
mot-clé est en fait réservé. - votre code fonctionne très bien si vous venez de supprimer le setter à la fois dans les classes xml est en prenant soin de fixer des valeurs pour les attributs. Si vous dites que vous avez besoin de la lecture & setter dans votre cours, puis ajoutez la ligne "@XmlAccessorType(XmlAccessType.CHAMP)" au-dessus de votre nom de la classe et après le "@XmlRootElement" annotation et il fonctionne très bien.
Vous devez vous connecter pour publier un commentaire.
L'exception est due à votre JAXB (JSR-222) la mise en œuvre de croire qu'il y a deux choses mappé avec le même nom (un champ ou une propriété). Il ya un couple d'options pour votre cas d'utilisation:
OPTION #1 - Annotation sur le Terrain avec
@XmlAccessorType(XmlAccessType.FIELD)
Si vous voulez annotation le terrain, puis vous devez spécifier
@XmlAccessorType(XmlAccessType.FIELD)
Fields.java:
Field.java:
OPTION #2 - Annoter les Propriétés
La valeur par défaut de l'accesseur est de type
XmlAccessType.PUBLIC
. Cela signifie que, par défaut, JAXB les implémentations de la carte des champs publics et des accesseurs pour XML. En utilisant le paramètre par défaut vous devez annoter le public accesseurs où vous souhaitez remplacer le mappage par défaut de comportement.Fields.java:
Field.java:
Pour Plus D'Informations
J'ai aussi été l'obtention de la
### counts of IllegalAnnotationExceptions
exception et il semblait être en raison d'une mauvaise dépendance de la hiérarchie dans mon Printemps de câblage.J'ai pensé à elle en mettant un point d'arrêt dans le JAXB code quand il fait le jeter. Pour moi, c'était à
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check()
. Puis j'ai viré lalist
variable qui donne quelque chose comme:La
does not have a no-arg default constructor
m'a semblé être trompeuse. Peut-être que je n'étais pas la compréhension de ce que l'exception a été dit. Mais il a indiqué qu'il y avait un problème avec monLocalContextHandlerCollection
. J'ai enlevé une dépendance de la boucle et l'erreur effacée.J'espère que cela sera utile à d'autres.
IllegalAnnotationsException
dans des environnements différents. S'avère, les versions de Java/JAXB importait. L' "n'a pas un no-arg constructeur par défaut" était en effet le problème pour moi, si. L'ajout d'un fixe!no-arg default constructor
qui a causé le problème. Merci!C'est parce que, par défaut, Jaxb quand sérialise un pojo, regarde pour les annotations sur le public et les membres(getters ou setters) les propriétés. Mais, vous fournir des annotations sur les champs. donc, soit changer et les annotations sur les incubateurs ou les accesseurs de propriétés, ou définit la XmlAccessortype de champ.
Option 1::
Option 2::
Pour plus de détails et de profondeur, vérifiez les points suivants JDK documentation http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html
Une des options suivantes peut provoquer l'exception:
de la réflexion pour charger vos classes, c'est pourquoi l'exception est levée.
Une fois, j'ai reçu ce message après avoir pensé que le fait de mettre
@XmlTransient
sur un domaine que je n'ai pas besoin de sérialiser, dans une classe qui a été annoté avec@XmlAccessorType(XmlAccessType.NONE)
.Dans ce cas, la suppression
XmlTransient
résolu le problème. Je ne suis pas un JAXB expert, mais je pense que parce que AccessType.AUCUN n'indique qu'aucune auto-sérialisation doit être fait (c'est à dire les champs doivent être précisés pour sérialiser) qui rendXmlTransient
illégale car son seul but est d'exclure le domaine de l'auto-sérialisation.J'ai eu ce même problème, j'ai été en passant un ressort de haricots à l'arrière comme un ResponseBody objet. Quand j'ai remis un objet créé par le nouveau, tout était bon.
J'ai eu le même problème
Mon Problème
Changé fait pour le résoudre sont ci-dessous
- Je changer le nom de l'espace de noms à l'
pourquoi?
Comme écrit dans le journal des erreurs de deux classes ont le même nom, donc nous devons utiliser l'espace de noms espaces de noms XML sont utilisés pour fournir uniquement le nom des éléments et des attributs d'un document XML.
Toutes les options ci-dessous a fonctionné pour moi.
Option 1: Annotation pour le CHAMP à la classe & terrain avec getter/setter
Option 2: Pas d'Annotation pour le CHAMP au niveau de la classe(@XmlAccessorType(XmlAccessType.CHAMP) et avec seulement une méthode de lecture. Ajouter le Setter de la méthode de jeter l'erreur que nous ne sommes pas y compris les Annotations dans ce cas. Rappelez-vous, setter n'est pas nécessaire lorsque vous définissez explicitement les valeurs dans le fichier XML.
Option 3: l'Annotation méthode de lecture seule. Rappelez-vous, nous pouvons aussi utiliser la méthode setter ici que nous ne faisons pas n'importe quel CHAMP niveau d'annotation dans ce cas.
Espère que cela vous aide!
pour moi, cette erreur a été effectivement causé par un champ faussement déclarée public au lieu de privé.