42 Stimmen

JAXB IllegalAnnotationException wird beim Parsen von XML ausgelöst

Dies ist meine XML-Datei:

Ich habe 2 Klassen erstellt, um sie zu parsen (Fields.java und Field.java):

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

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

und

public class Field {

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

Aber ich erhalte diese Ausnahme:

[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]

Ich kann nicht verstehen, warum diese Ausnahme ausgelöst wird. Die Ausnahme befindet sich hier:

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

Ich verwende JDK 1.6_0.0.7. Danke.

1voto

bluscreen Punkte 31

Für mich wurde dieser Fehler tatsächlich durch ein Feld verursacht, das fälschlicherweise als öffentlich anstelle von privat deklariert wurde.

0voto

BillFromHawaii Punkte 334

Ich hatte dasselbe Problem, ich habe eine Spring-Bohne als ResponseBody-Objekt zurückgegeben. Als ich ein Objekt zurückgegeben habe, das von new erstellt wurde, war alles gut.

0voto

rewrihitesh Punkte 35

Ich hatte das gleiche Problem

Mein Problem

Verursacht durch: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 Zähler von IllegalAnnotationExceptions

Zwei Klassen haben den gleichen XML-Typnamen "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearch". Verwenden Sie @XmlType.name und @XmlType.namespace, um ihnen unterschiedliche Namen zuzuweisen.
Dieses Problem ist mit dem folgenden Ort verbunden:
bei katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch
bei public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearch(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch)
bei katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory
Dieses Problem ist mit dem folgenden Ort verbunden:
bei cpq_tns_kat_getgroupsearch.KatGetgroupsearch

Zwei Klassen haben den gleichen XML-Typnamen "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearchResponse0". Verwenden Sie @XmlType.name und @XmlType.namespace, um ihnen unterschiedliche Namen zuzuweisen.
Dieses Problem ist mit dem folgenden Ort verbunden:
bei katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0
bei public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearchResponse0(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0)
bei katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory
Dieses Problem ist mit dem folgenden Ort verbunden:
bei cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0

Vorgenommene Änderungen, um es zu lösen, sind unten aufgeführt

Ich habe den entsprechenden Namen in den Namespace geändert

@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 = {

Warum?

Wie im Fehlerprotokoll angegeben, haben zwei Klassen denselben Namen, daher sollten wir Namespace verwenden, weil XML-Namespaces dazu dienen, eindeutig benannte Elemente und Attribute in einem XML-Dokument bereitzustellen.

0voto

mannedear Punkte 1158

Alle unten aufgeführten Optionen haben bei mir funktioniert.

Option 1: Annotation für FIELD auf Klassen- und Feldebene mit Getter-/Setter-Methoden

 @XmlRootElement(name = "fields")
 @XmlAccessorType(XmlAccessType.FIELD)
    public class Fields {

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

Option 2: Keine Annotation für FIELD auf Klassenebene (@XmlAccessorType(XmlAccessType.FIELD)) und nur mit Getter-Methode. Das Hinzufügen einer Setter-Methode wirft einen Fehler, da wir in diesem Fall die Annotation nicht inkludieren. Denken Sie daran, dass ein Setter nicht erforderlich ist, wenn Sie die Werte explizit in Ihrer XML-Datei setzen.

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

        @XmlElement(name = "field")
        List fields = new ArrayList();
            //getter
    }

Option 3: Annotation nur auf Getter-Methode. Denken Sie daran, dass wir hier auch die Setter-Methode verwenden können, da wir in diesem Fall keine Feldniveau-Annotation durchführen.

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

        List fields = new ArrayList();

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

        //setter
    }

Hoffentlich hilft Ihnen das weiter!

0voto

snydergd Punkte 443

In meinem Fall konnte ich das Problem finden, indem ich vorübergehend die Ausnahme abgefangen, in die Ursachen eingestiegen bin, wie es erforderlich war (basierend darauf, wie tief die IllegalAnnotationException war), und darauf getErrors() aufgerufen habe.

    try {
        // in meinem Fall hat mir dies eine Ausnahme verursacht
        endpoint.publish("/MyWebServicePort");
    // Ich habe eine WebServiceException erhalten, die durch eine andere Ausnahme verursacht wurde, die durch die IllegalAnnotationsException verursacht wurde
    } catch (WebServiceException e) {
        // Übrigens muss ich darauf getCause().getCause() aufrufen und vor einem Aufruf von getErrors() auf IllegalAnnotationsException casten
        System.err.println(((com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException)e.getCause().getCause()).getErrors());
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X