Какая разница между аннотациями JAXB на основе getter против seters против членов?
Название говорит все.
Я хотел бы знать, в чем принципиальная разница между помещением аннотации JAXB (например, @XmlElement
) в поле /getter/setter. Мне кажется, что (в простых случаях) это не имеет значения.
например. давайте возьмем этот
class A {
private String a;
public String getA() { return a; }
public void setA(String a) { this.a = a; }
}
теперь мне кажется, что не имеет значения, помещаю ли я @XmlElement
в поле члена или на getter/setter. Он просто работает. Есть ли какие-либо неудобства, когда мне нужно различать и когда это имеет значение?
Когда я перехожу к unmarshall (xml обратно к A), что конкретно делает JAXB?
Я использую реализацию JAXB MOXy
Спасибо
Ответы
Ответ 1
По умолчанию JAXB impls будет обрабатывать свойства (пары get/set), публичные поля (переменные экземпляра) и аннотированные непубличные поля в качестве отображаемых. Если вы просто аннотируете поле, вы получите исключение дублированного сопоставленного свойства.
Если вы хотите аннотировать поле, вы должны указать @XmlAccessorType(XmlAccessType.FIELD)
в классе.
Дополнительная информация
Ответ 2
Я не обнаружил различий в маркировке аннотаций JAXB по методам setter и методам getter. Я тестировал как сортировку, так и разборку, и оба они отлично работали. Но вы должны только комментировать один из них; либо метод геттера, либо метод сеттера; вы не можете комментировать их, иначе вы получите исключение во время выполнения, как показано ниже.
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)