xmlelement xlxp2 webserviceexception unknown saxexception2 not marshalexception known jaxbcontextimpl jaxbcontext context annotation java exception jaxb

java - xlxp2 - No entiendo por qué se emite esta excepción IllickAnnotationException de JAXB



saxexception2 is not known to this context (8)

Este es mi archivo XML:

<fields> <field mappedField="Num"> </field> <field mappedField="Type"> </field> </fields>

Hice 2 clases para analizarlo (Fields.java y Field.java):

@XmlRootElement(name = "fields") public class Fields { @XmlElement(name = "field") List<Field> fields = new ArrayList<Field>(); //getter, setter }

y

public class Field { @XmlAttribute(name = "mappedField") String mappedField; /getter,setter }

Pero me sale esta excepción.

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

No puedo entender por qué se levanta esta excepción. La excepción está aquí:

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

Yo uso JDK 1.6_0.0.7. Gracias.


No entiendo por qué se emite esta excepción IllickAnnotationException de JAXB

También recibía los ### counts of IllegalAnnotationExceptions excepción ### counts of IllegalAnnotationExceptions y parecía deberse a una jerarquía de dependencias inadecuada en mi cableado de Spring.

Lo resolví poniendo un punto de interrupción en el código JAXB cuando realiza el lanzamiento. Para mí esto fue en com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check() . Luego descargué la variable de list 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.] ....

El does not have a no-arg default constructor que me parece ser 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 . Quité un bucle de dependencia y el error se borró.

Esperemos que esto sea de ayuda para otros.


Esto se debe a que, de forma predeterminada, Jaxb cuando serializa un pojo, busca las anotaciones sobre los miembros públicos (captadores o definidores) de las propiedades. Pero, usted está proporcionando anotaciones en los campos. por lo tanto, cambie y establezca las anotaciones en los configuradores o en los que obtienen propiedades, o establezca el campo XmlAccessortype.

Opción 1::

@XmlRootElement(name = "fields") @XmlAccessorType(XmlAccessType.FIELD) public class Fields { @XmlElement(name = "field") List<Field> fields = new ArrayList<Field>(); //getter, setter } @XmlAccessorType(XmlAccessType.FIELD) public class Field { @XmlAttribute(name = "mappedField") String mappedField; //getter,setter }

Opcion 2::

@XmlRootElement(name = "fields") public class Fields { List<Field> fields = new ArrayList<Field>(); @XmlElement(name = "field") public List<Field> getFields() { } //setter } @XmlAccessorType(XmlAccessType.FIELD) public class Field { String mappedField; @XmlAttribute(name = "mappedField") public String getMappedField() { } //setter }

Para obtener más detalles y profundidad, consulte la siguiente documentación de JDK http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html


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 - @XmlAccessorType(XmlAccessType.FIELD) 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 asignarán los campos públicos y los accesores a XML. Usando la configuración predeterminada, debe anotar los accesores públicos en los que desea anular el comportamiento de mapeo 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


Todas las opciones a continuación funcionaron para mí.

Opción 1: anotación para FIELD a nivel de clase y campo con métodos de obtención / establecimiento

@XmlRootElement(name = "fields") @XmlAccessorType(XmlAccessType.FIELD) public class Fields { @XmlElement(name = "field") List<Field> fields = new ArrayList<Field>(); //getter, setter }

Opción 2: No hay anotación para FIELD a nivel de clase (@XmlAccessorType (XmlAccessType.FIELD) y solo con el método getter. Agregar el método Setter arrojará el error, ya que no se incluye la anotación en este caso. Recuerde que no es necesario establecer establece explícitamente los valores en tu archivo XML.

@XmlRootElement(name = "fields") public class Fields { @XmlElement(name = "field") List<Field> fields = new ArrayList<Field>(); //getter }

Opción 3: Anotación en el método getter solo. Recuerde que también podemos usar el método de establecimiento aquí ya que no estamos haciendo ninguna anotación de nivel de CAMPO en este caso.

@XmlRootElement(name = "fields") public class Fields { List<Field> fields = new ArrayList<Field>(); @XmlElement(name = "field") //getter //setter }

¡Espero que esto te ayude!


Tuve este mismo problema, estaba devolviendo un bean spring como un objeto ResponseBody. Cuando devolví un objeto creado por nuevo, todo estaba bien.


Una vez recibí este mensaje después de pensar que poner @XmlTransient en un campo que no necesitaba serializar, en una clase anotada con @XmlAccessorType(XmlAccessType.NONE) .

En ese caso, eliminar XmlTransient resolvió el problema. No soy un experto en JAXB, pero sospecho que debido a que AccessType.NONE indica que no se debe realizar la auto-serialización (es decir, los campos deben anotarse específicamente para serializarlos), lo que hace que XmlTransient sea ​​ilegal ya que su único propósito es excluir un campo de auto -publicación por entregas.


Uno de los siguientes puede causar la excepción:

  1. Agregue un constructor público vacío a su clase de Campos, JAXB usa la reflexión para cargar sus clases, por eso se lanza la excepción.
  2. Agregue el getter y el setter para su lista.

Yo estaba teniendo el mismo problema

Mi problema

Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Two classes have the same XML type name "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearch". Use @XmlType.name and @XmlType.namespace to assign different names to them. this problem is related to the following location: at katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch at public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearch(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearch) at katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory this problem is related to the following location: at cpq_tns_kat_getgroupsearch.KatGetgroupsearch Two classes have the same XML type name "{urn:cpq_tns_Kat_getgroupsearch}Kat_getgroupsearchResponse0". Use @XmlType.name and @XmlType.namespace to assign different names to them. this problem is related to the following location: at katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0 at public javax.xml.bind.JAXBElement katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory.createKatGetgroupsearchResponse0(katrequest.cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0) at katrequest.cpq_tns_kat_getgroupsearch.ObjectFactory this problem is related to the following location: at cpq_tns_kat_getgroupsearch.KatGetgroupsearchResponse0

Los cambios realizados para resolverlo están abajo.

Cambio el nombre respectivo al espacio de nombres.

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

¿por qué?

Como se escribió en el registro de errores, dos clases tienen el mismo nombre, por lo que deberíamos usar el espacio de nombres porque los espacios de nombres XML se usan para proporcionar elementos y atributos con nombres únicos en un documento XML.