标题说明了一切。
我想知道在field / getter / setter上放置JAXB注释(如@XmlElement
)之间的主要区别是什么。在我看来(在简单的情况下)并不重要。
E.g。我们拿这个
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实现
由于
答案 0 :(得分:10)
默认情况下,JAXB impls会将属性(获取/设置对),公共字段(实例变量)和带注释的非公共字段视为映射。如果您只是注释一个字段,您将获得一个重复的映射属性异常。
如果要注释该字段,则应在类上指定@XmlAccessorType(XmlAccessType.FIELD)
。
了解更多信息
答案 1 :(得分:0)
我发现在setter方法和getter方法上标记JAXB注释没有区别。我测试了编组和解组,它们都运行良好。但你应该只注释其中一个; getter方法或setter方法;你不能注释两者,否则你会得到如下的运行时异常。
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)