Ontem, ao tentar converter uma string XML em um POJO, encontrei este erro:
javax.xml.bind.DataBindingException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "entries"
this problem is related to the following location:
at ....
this problem is related to the following location:
at ....
at ....
etc...
Aqui estão meus códigos POJO:
@XmlRootElement
public class EntryMappings {
@XmlElement(name="entryMapping")
private List<EntryMapping> entries;
public List<EntryMapping> getEntries() {
return this.entries;
}
}
Acontece que o tipo de acesso de ligação padrão JAXB, XmlAccessType.PUBLIC_MEMBER , tentará ligar todos os campos públicos, campos anotados e propriedades. No meu caso, ele tentou a vinculação no campo de entradas e no campo getEntries () .
A solução é escolher o XmlAccessType de forma que a ligação ocorra apenas uma vez.
Exemplo 1 – Vincular por campos:
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class EntryMappings {
@XmlElement(name="entryMapping")
private List<EntryMapping> entries;
public List<EntryMapping> getEntries() {
return this.entries;
}
}
Exemplo 2 – Vincular por propriedades:
@XmlRootElement
@XmlAccessorType(XmlAccessType.PROPERTY)
public class EntryMappings {
private List<EntryMapping> entries;
@XmlElement(name="entryMapping")
public List<EntryMapping> getEntries() {
return this.entries;
}
}
Exemplo 3 – Vincular por campos anotados ou propriedades anotadas
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class EntryMappings {
@XmlElement(name="entryMapping")
private List<EntryMapping> entries;
public List<EntryMapping> getEntries() {
return this.entries;
}
}
créditos e referências:
http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html
http://docs.oracle.com/javaee/5/api/javax/xml/bind/annotation /XmlAccessType.html