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:
- 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.
- Agregue getter y setter separados para su lista.