tipos persistencia crear anotaciones annotation java xml jaxb marshalling unmarshalling

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)