Saltar al contenido

No puedo entender por qué se lanza esta JAXB IllegalAnnotationException

Solución:

La excepción se debe a que su implementación JAXB (JSR-222) cree que hay dos cosas asignadas con el mismo nombre (un campo y una propiedad). Hay un par de opciones para su caso de uso:

OPCIÓN # 1 – Anotar el campo con @XmlAccessorType(XmlAccessType.FIELD)

Si desea anotar el campo, debe especificar @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;
    }

}

OPCIÓN # 2 – Anotar las propiedades

El tipo de acceso predeterminado es XmlAccessType.PUBLIC. Esto significa que, de forma predeterminada, las implementaciones de JAXB mapearán los campos públicos y los accesos a XML. Con la configuración predeterminada, debe anotar los descriptores de acceso públicos donde desee anular el comportamiento de asignación predeterminado.

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;
    }

}

Para más información

  • http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html

No puedo entender por qué se lanza esta JAXB IllegalAnnotationException

Yo también estaba recibiendo el ### counts of IllegalAnnotationExceptions excepción y parecía deberse a una jerarquía de dependencia incorrecta en mi cableado de Spring.

Lo descubrí poniendo un punto de interrupción en el código JAXB cuando se lanza. Para mi esto fue en com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(). Entonces dejé el list variable que da algo como:

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

los does not have a no-arg default constructor me pareció engañoso. Tal vez no entendía lo que decía la excepción. Pero sí indicó que había un problema con mi LocalContextHandlerCollection. Eliminé un bucle de dependencia y se borró el error.

Con suerte, esto será útil para otros.

Uno de los siguientes puede causar la excepción:

  1. Agregue un constructor público vacío a su clase Fields, JAXB usa la reflexión para cargar sus clases, por eso se lanza la excepción.
  2. Agregue getter y setter separados para su lista.
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *