我可以通过两种方式声明JAXB元素:
@XmlElement
public int x;
Run Code Online (Sandbox Code Playgroud)
要么
private int x;
@XmlElement
public int getX(){...}
Run Code Online (Sandbox Code Playgroud)
无论如何,第一个变体AFAIK会创建getter,并将其映射到XML。这两种方式有什么区别?
它与@XmlAccessorType注释有关。
XmlAccessType.PROPERTY :仅当某些JAXB注释对字段进行显式注释时,字段才绑定到XML。
XmlAccessType.FIELD:仅当使用某些JAXB批注显式批注它们时,getter / setter对才绑定到XML。
更新以根据评论进行解释:
让我们考虑一个看起来像这样的简单xml:
<root>
<value>someValue</value>
</root>
Run Code Online (Sandbox Code Playgroud)
我们有一堂课:
@XmlRootElement(name = "root")
//@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlAccessorType(XmlAccessType.FIELD)
public class DemoRoot {
@XmlElement
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
如果您尝试取消使用XmlAccessType.FIELD和@XmlElement字段上方的注释的编组,则可以取消编组。
如果使用,XmlAccessType.PROPERTY您将收到以下错误:
IllegalAnnotationsException:IllegalAnnotationExceptions类的1个计数具有两个同名“值”的属性
这是因为它同时考虑了带有@XmlElement字段“值” 的显式注释和getter / setter方法。
反之亦然,如果您@XmlElement在getter / setter上移动注释。