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.

65voto

bdoughan Punkte 144925

Die Ausnahme liegt darin, dass Ihre JAXB (JSR-222)-Implementierung davon ausgeht, dass zwei Dinge mit dem gleichen Namen abgebildet sind (ein Feld und eine Eigenschaft). Es gibt ein paar Optionen für Ihren Anwendungsfall:

OPTION #1 - Kennzeichnen Sie das Feld mit @XmlAccessorType(XmlAccessType.FIELD)

Wenn Sie das Feld kennzeichnen möchten, sollten Sie @XmlAccessorType(XmlAccessType.FIELD) angeben

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 {

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

    public String getMappedField() {
        return mappedField;
    }

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

}

OPTION #2 - Kennzeichnen Sie die Eigenschaften

Der Standardzugriffstyp ist XmlAccessType.PUBLIC. Das bedeutet, dass JAXB-Implementierungen standardmäßig öffentliche Felder und Zugriffsmethoden auf XML abbilden werden. Wenn Sie die Standardeinstellung verwenden, sollten Sie die öffentlichen Zugriffsmethoden kennzeichnen, wenn Sie das Standardabbildungsverhalten überschreiben möchten.

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 {

    String mappedField;

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

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

}

Weitere Informationen

29voto

Gray Punkte 111812

Ich verstehe nicht, warum diese JAXB IllegalAnnotationException ausgelöst wird

Ich habe auch die Ausnahme ### counts of IllegalAnnotationExceptions bekommen und es schien aufgrund einer falschen Abhängigkeitshierarchie in meiner Spring-Verdrahtung zu sein.

Ich habe es herausgefunden, indem ich einen Breakpoint im JAXB-Code gesetzt habe, wenn es den Fehler wirft. Für mich war das bei com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(). Dann habe ich die list Variable ausgegeben, die etwas wie folgt liefert:

[org.mortbay.jetty.Handler ist ein Interface, und JAXB kann keine Interfaces behandeln.
Dieses Problem hängt mit dem folgenden Ort zusammen:
    bei org.mortbay.jetty.Handler
    bei public org.mortbay.jetty.Handler[] org.mortbay.jetty.handler.HandlerCollection.getHandlers()
    bei org.mortbay.jetty.handler.HandlerCollection
    bei org.mortbay.jetty.handler.ContextHandlerCollection
    bei com.mprew.ec2.commons.server.LocalContextHandlerCollection
    bei private com.mprew.ec2.commons.server.LocalContextHandlerCollection com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection.arg0
    bei com.mprew.ec2.commons.services.jaxws_asm.SetLocalContextHandlerCollection,
org.mortbay.jetty.Handler hat keinen Standardkonstruktor ohne Argument.]
....

Das hat keinen Standardkonstruktor ohne Argument schien für mich irreführend zu sein. Vielleicht habe ich nicht verstanden, was die Ausnahme aussagt. Aber es deutete darauf hin, dass es ein Problem mit meinem LocalContextHandlerCollection gab. Ich habe eine Abhängigkeitsschleife entfernt und der Fehler wurde behoben.

Hoffentlich ist das für andere hilfreich.

11voto

GingerHead Punkte 8012

Eines der folgenden Dinge kann die Ausnahme verursachen:

  1. Fügen Sie einen leeren öffentlichen Konstruktor zu Ihrer Fields-Klasse hinzu, JAXB verwendet Reflektion, um Ihre Klassen zu laden, deshalb wird die Ausnahme ausgelöst.
  2. Fügen Sie separate Getter und Setter für Ihre Liste hinzu.

11voto

Love Hasija Punkte 2498

Dies liegt daran, dass JAXB standardmäßig beim Serialisieren eines POJO nach den Annotationen über den öffentlichen Elementen (Getters oder Setters) der Eigenschaften sucht. Sie geben jedoch Annotationen auf Feldern an. daher entweder die Annotationen in Setters oder Getters der Eigenschaften ändern und setzen, oder setzt XmlAccessorType auf Feld.

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 {

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

       String mappedField;

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

       }

        //setter
}

Für weitere Details und Tiefe siehe die folgende JDK-Dokumentation http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html

2voto

DVA Punkte 331

Ich habe einmal diese Nachricht erhalten, nachdem ich dachte, dass das Hinzufügen von @XmlTransient zu einem Feld, das ich nicht serialisieren musste, in einer Klasse, die mit @XmlAccessorType(XmlAccessType.NONE) annotiert war.

In diesem Fall löste das Entfernen von XmlTransient das Problem. Ich bin kein JAXB-Experte, aber ich vermute, dass XmlTransient illegal ist, da AccessType.NONE darauf hinweist, dass keine automatische Serialisierung erfolgen sollte (d.h. Felder müssen speziell annotiert werden, um sie zu serialisieren), was dem Zweck von XmlTransient widerspricht, ein Feld von der automatischen Serialisierung auszuschließen.

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