在field之前和getter声明之前使用@XmlElement有什么区别?

Gan*_*nus 0 java xml jaxb

我可以通过两种方式声明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。这两种方式有什么区别?

mar*_*art 6

它与@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上移动注释。