JAXB 注释放在 getter 与 setter 和成员上有什么区别?



标题说明了一切。

我想知道将 JAXB 注释(如 @XmlElement)放在现场/getter/setter 上之间的原则区别是什么。在我看来,(在简单的情况下)这并不重要。

例如,让我们以这个为例

class A  {
    private String a;
    public String getA() { return a; }
    public void setA(String a) { this.a = a; }
}

现在在我看来,我把@XmlElement放在会员字段还是 getter/setter 上并不重要。它只是编组好。当我需要有所作为以及何时确实重要时,是否有任何用例?

当我去解组这个(xml回到A)JAXB具体做了什么?

我正在使用 JAXB MOXy 实现

谢谢

缺省情况下,JAXB impls 会将属性(获取/设置对)、公共字段(实例变量)和带注释的非公共字段视为映射。 如果您只是注释一个字段,您将获得重复的映射属性异常。

如果要对字段进行批注,则应在类上指定@XmlAccessorType(XmlAccessType.FIELD)

欲了解更多信息

  • http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html

我发现在setter方法和getter方法上标记JAXB注释没有区别。我测试了编组和取消编组,它们都工作得很好。但是您应该只注释其中之一;吸气剂方法或二传手法;您不能同时注释两者,否则将获得如下所示的运行时异常。

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:445)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:277)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:124)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1123)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:147)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:247)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:234)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:462)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:641)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)

最新更新