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

2022-09-01 17:44:59

标题说明了一切。

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

例如,让我们拿这个

class A  {
    private String a;

    public String getA() { return a; }

    public void setA(String a) { this.a = a; }
}

现在在我看来,我是否放在成员字段或getter /setter上并不重要。它只是马歇尔好吧。当我需要有所作为时,当它确实很重要时,是否有任何用例?@XmlElement

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

我正在使用 JAXB MOXy 实现

谢谢


答案 1

缺省情况下,JAXB impls 会将属性(get/set 对)、公共字段(实例变量)和带注释的非公共字段视为映射。如果只是对字段进行批注,则会收到重复的映射属性异常。

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

详细信息


答案 2

我发现在 setter 方法和 getter 方法上标记 JAXB 注释没有区别。我测试了编组和取消编组,它们都工作正常。但是您只应注释其中一个;获取器方法或 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)

推荐