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

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

@XmlElement public int x; 

要么

 private int x; @XmlElement public int getX(){...} 

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

它与@XmlAccessorType注释有关。

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

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

根据评论更新解释:

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

  someValue  

我们有一节课:

 @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字段’value’显式注释和getter / setter。

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