我可以用两种方式声明JAXB元素:
@XmlElement
public int x;
或
private int x;
@XmlElement
public int getX(){...}
第一个变体AFAIK无论如何都会创建映射到XML的getter。这两种方式有什么区别?
答案 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绑定: