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

时间:2018-02-20 15:06:54

标签: java xml jaxb

我可以用两种方式声明JAXB元素:

@XmlElement
public int x;

private int x;

@XmlElement
public int getX(){...}

第一个变体AFAIK无论如何都会创建映射到XML的getter。这两种方式有什么区别?

2 个答案:

答案 0 :(得分:5)

它与@XmlAccessorType注释有关。

  • XmlAccessType.PROPERTY:只有在某些JAXB注释明确注释字段时,字段才会绑定到XML。

  • XmlAccessType.FIELD:Getter / setter对只有在被某些JAXB注释明确注释时才绑定到XML

根据评论更新解释:

让我们考虑一个看起来像这样的简单xml:

<root>
    <value>someValue</value>
</root>

我们有一个班级:

@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;
    }
}

如果您尝试使用XmlAccessType.FIELD和字段上方的@XmlElement注释进行解组,则可以解组。

如果您使用XmlAccessType.PROPERTY,则会收到以下错误:

IllegalAnnotationsException:IllegalAnnotationExceptions类的1个计数具有两个同名“value”的属性

这是因为它考虑了明确注释的@XmlElement字段'值'和getter / setter。

反之亦然,如果你在getter / setter上移动@XmlElement注释。

答案 1 :(得分:0)

在这篇文章http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html中,对在字段之前或在获取方法之前使用@XMLElement(以及类似的注释)进行了很好的解释。

在类之前的以下注释确定字段/获取程序的XML绑定:

  • @XmlAccessorType(XmlAccessType.PUBLIC_MEMBER):公共字段,带注释的字段和属性
  • @XmlAccessorType(XmlAccessType.PROPERTY):带注释的字段和属性
  • @XmlAccessorType(XmlAccessType.FIELD):字段和带注释的属性
  • @XmlAccessorType(XmlAccessType.NONE):带注释的字段和带注释的属性