persistencia - crear annotations en java
¿Cuál es la diferencia entre las anotaciones JAXB puestas en getter versus setters versus miembros? (2)
El título lo dice todo.
Me gustaría saber cuál es la diferencia principal entre poner una anotación JAXB (como @XmlElement
) en el campo / getter / setter. Me parece que (en casos simples) no importa.
Por ejemplo, vamos a tomar esto
class A {
private String a;
public String getA() { return a; }
public void setA(String a) { this.a = a; }
}
ahora me parece que no importa si pongo @XmlElement
en el campo de miembro o en getter / setter. Simplemente funciona bien. ¿Hay algún uso cuando necesito hacer una diferencia y cuando importa?
Cuando voy a deshacer esto (xml a A), ¿qué hace JAXB específicamente?
Estoy usando la implementación JAXB MOXy
Gracias
Por defecto, las impls de JAXB tratarán las propiedades (pares get / set), los campos públicos (variables de instancia) y los campos no públicos anotados como mapeados. Si solo anota un campo obtendrá una excepción de propiedad mapeada duplicada.
Si desea anotar el campo, debe especificar @XmlAccessorType(XmlAccessType.FIELD)
en la clase.
Para más información
No he encontrado diferencias al marcar las anotaciones de JAXB en métodos setter y getter. Probé tanto el marshalling como el unmarshalling, y ambos funcionaron bien. Pero solo debes anotar uno de ellos; ya sea el método getter o el método setter; no puede anotar ambos, de lo contrario obtendrá una excepción de tiempo de ejecución como la siguiente.
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:445)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)