Não consigo entender por que essa exceção ilegal de JAXB é lançada

Este é o meu arquivo XML:

      

Eu fiz 2 classs para analisá-lo (Fields.java e Field.java):

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

e

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

Mas eu recebo essa exceção.

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

Eu não consigo entender porque essa exceção aumenta. Exceção está aqui:

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

Eu uso o JDK 1.6_0.0.7. Obrigado.

A exceção é devido à implementação do JAXB (JSR-222), acreditando que há duas coisas mapeadas com o mesmo nome (um campo e uma propriedade). Existem algumas opções para o seu caso de uso:

OPÇÃO # 1 – Anote o campo com @XmlAccessorType(XmlAccessType.FIELD)

Se você quiser anotar o campo, então você deve 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 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; } } 

OPÇÃO # 2 – Anote as propriedades

O tipo de acessador padrão é XmlAccessType.PUBLIC . Isso significa que, por padrão, as implementações do JAXB mapearão campos públicos e acessadores para XML. Usando a configuração padrão, você deve anotar os acessadores públicos nos quais deseja replace o comportamento de mapeamento padrão.

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

Para maiores informações

Não consigo entender por que essa exceção ilegal de JAXB é lançada

Eu também estava recebendo a ### counts of IllegalAnnotationExceptions exceção ### counts of IllegalAnnotationExceptions e parecia ser devido a uma hierarquia de dependência imprópria na minha fiação de spring.

Eu descobri colocando um ponto de interrupção no código JAXB quando ele faz o lançamento. Para mim, isso foi em com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check() . Então eu despejei a variável list que dá 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.] .... 

O does not have a no-arg default constructor pareceu-me enganoso. Talvez eu não estivesse entendendo o que a exceção estava dizendo. Mas isso indicou que houve um problema com meu LocalContextHandlerCollection . Eu removi um loop de dependência e o erro foi limpo.

Espero que isso seja útil para os outros.

Isso ocorre porque, por padrão, o Jaxb, quando serializa um pojo, procura as annotations sobre os membros públicos (getters ou setters) das propriedades. Mas você está fornecendo annotations em campos. Portanto, altere e defina as annotations em setters ou getters of properties ou defina o campo XmlAccessortype to.

Opção 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 } 

Opção 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 } 

Para mais detalhes e profundidade, verifique a seguinte documentação do JDK http://docs.oracle.com/javase/6/docs/api/javax/xml/bind/annotation/XmlAccessorType.html

Um dos seguintes pode causar a exceção:

  1. Adicione um construtor público vazio à sua class Fields, o JAXB usa a reflection para carregar suas classs, é por isso que a exceção é lançada.
  2. Adicione getter e setter separados para sua lista.

Uma vez recebi esta mensagem depois de pensar que colocando @XmlTransient em um campo que eu não @XmlTransient serializar, em uma class que foi anotada com @XmlAccessorType(XmlAccessType.NONE) .

Nesse caso, a remoção do XmlTransient resolveu o problema. Eu não sou um especialista em JAXB, mas suspeito que, porque AccessType.NONE indica que nenhuma serialização automática deve ser feita (ou seja, os campos devem ser especificamente anotados para serializá-los) que torna XmlTransient ilegal, pois seu único objective é excluir um campo de auto -serialização.

Eu tive esse mesmo problema, eu estava passando um bean de volta como um object ResponseBody. Quando eu devolvi um object criado por novo, tudo estava bem.

Eu estava tendo o mesmo problema

Minha edição

 Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions Two classs 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 classs 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 

Mudou feito para resolvê-lo estão abaixo

Eu mudo o respectivo nome para namespace

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

porque?

Conforme escrito no log de erros, duas classs têm o mesmo nome, portanto, devemos usar o namespace porque os namespaces XML são usados ​​para fornecer elementos e atributos com nomes exclusivos em um documento XML.

Todas as opções abaixo funcionaram para mim.

Opção 1: Anotação para FIELD em nível de class e campo com methods getter / setter

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

Opção 2: Sem Anotação para FIELD no nível de class (@XmlAccessorType (XmlAccessType.FIELD) e com apenas método getter. Adicionar o método Setter lançará o erro, pois não estamos incluindo a Anotação neste caso. Lembre-se, setter não é necessário quando você defina explicitamente os valores em seu arquivo XML.

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

Opção 3: Anotação no método getter sozinho. Lembre-se que também podemos usar o método setter aqui, pois não estamos fazendo nenhuma anotação no nível FIELD neste caso.

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

Espero que isso ajude você!