【问题标题】:What is the difference between using @XmlElement before field and before getter declaration?在字段之前和 getter 声明之前使用 @XmlElement 有什么区别?
【发布时间】:2018-02-20 15:06:54
【问题描述】:

我可以通过两种方式声明 JAXB 元素:

@XmlElement
public int x;

或

private int x;

@XmlElement
public int getX(){...}

第一个变体,AFAIK,创建 getter,映射到 XML,无论如何。这两种方式有什么区别?

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    它与@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 注释,反之亦然。

    【讨论】:

    • 我为我的文盲感到非常抱歉,但你能详细说明一下你的答案吗?请举个例子好吗?
    • 对不起,我现在举个例子
    【解决方案2】:

    @XMLElement(和类似的注释)在字段之前或 getter 之前的使用在这篇文章中得到了很好的解释:http://blog.bdoughan.com/2011/06/using-jaxbs-xmlaccessortype-to.html。

    类之前的以下注解确定字段/getter 的 XML 绑定:

    • @XmlAccessorType(XmlAccessType.PUBLIC_MEMBER):公共字段、注释字段和属性
    • @XmlAccessorType(XmlAccessType.PROPERTY):带注释的字段和属性
    • @XmlAccessorType(XmlAccessType.FIELD):字段和带注释的属性
    • @XmlAccessorType(XmlAccessType.NONE):带注释的字段和带注释的属性

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 2020-03-04
      相关资源
      最近更新 更多