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:
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ê!