【发布时间】:2018-02-20 15:06:54
【问题描述】:
我可以通过两种方式声明 JAXB 元素:
@XmlElement
public int x;
或
private int x;
@XmlElement
public int getX(){...}
第一个变体,AFAIK,创建 getter,映射到 XML,无论如何。这两种方式有什么区别?
【问题讨论】:
我可以通过两种方式声明 JAXB 元素:
@XmlElement
public int x;
或
private int x;
@XmlElement
public int getX(){...}
第一个变体,AFAIK,创建 getter,映射到 XML,无论如何。这两种方式有什么区别?
【问题讨论】:
它与@XmlAccessorType 注释有关。
XmlAccessType.PROPERTY :字段仅在被某些 JAXB 注释显式注释时才绑定到 XML。
XmlAccessType.FIELD:只有在某些 JAXB 注释明确注释时,Getter/setter 对才绑定到 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: 1 计数 IllegalAnnotationExceptions 类有两个同名的属性“值”
这是因为它同时考虑了带有 @XmlElement 字段“值”的显式注释和 getter/setter。
如果您在 getter/setter 上移动 @XmlElement 注释,反之亦然。
【讨论】:
@XMLElement(和类似的注释)在字段之前或 getter 之前的使用在这篇文章中得到了很好的解释:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html。
类之前的以下注解确定字段/getter 的 XML 绑定:
【讨论】: