JAXB的@XmlElement注解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAXB的@XmlElement注解相关的知识,希望对你有一定的参考价值。

参考技术A 对一个field来说,最基本的注解就是 @XmlElement 。它表示这个field将在XML中被转成一个element。它允许你定义XML的name,namespace,还有它是否是可选的(optional)或者是可为空的(nillable),默认值,Java类。这里是两个被注解的field,下面是对应的schema片段:

如果一个field有一些collection类型,那么将不得不将超过一个 @XmlElement 的注解关联这个field。这需要这些注解被组装到一个 @XmlElements 注解,而它只是作为一个容器。在下面这个class定义中,它的 entryOrChoiceOrCascade field是一个collection,其中包含了三个不同类的对象。

你应该为list element避免使用复杂的名字。

JAXB学习: 对JAXB支持的主要注解的说明

我们在上一篇中对JAXB有了一个大致的认识,现在我们来了解JAXB的一些主要注解。

 

顶层元素:XmlRootElement

表示整个XML文档的类应该使用XmlRootElement修饰,其实就像之前那个简单例子那样,XmlRootElement也是最简单JAXB应用唯一需要用到的注解。

 

控制元素的选择:XmlAccessorType XmlTransient

如果JAXB绑定一个java类为XML,那么默认的会绑定所有public成员,包括 public的getter和setter对(必须同时有getter和setter)或者是public的属性。任何protected ,default和private的成员只有在被一个恰当的注解(例如 XmlElement 或者XmlAttribute)修饰时才会被绑定。 我们有几种方式来影响这种默认的行为。

1. 在 包 或者 顶层元素(也就是XmlRootElement修饰的类)上 使用 XmlAccessorType, 它的值有  FIELDPROPERTYPUBLIC_MEMBER or NONE

  FIELD : 任何非static 非 transient 的属性将会被绑定

  PROPERTY :任何getter和setter对

  PUBLIC_MEMBER : 这个就是上面描述的默认情况

  NONE : NONE会压制任何绑定,除非明确的使用XmlElement或XmlAttribute修饰。

没有这个注解的类 可以从父类或者包级别的配置来继承。

2. 使用XmlTransient, 它会压制它的目标绑定。 考虑下面这种情况,有一个public 的属性foo,还有一对getFoo和setFoo,如果我们使用默认的配置将会出现 命名冲突,这时就可以使用XmlTransient来压制其中一个。

下面的例子我们在包级别使用XmlAccessorType,将绑定设置为 FIELD, 然后使用XmlTransient 压制其中的一个public属性。

首先在包下面建一个package-info.java 文件用来进行包注释。

@javax.xml.bind.annotation.XmlAccessorType(javax.xml.bind.annotation.XmlAccessType.FIELD)
package com.massclouds.test;

 

顶层元素类:

package com.massclouds.test;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
public class Person {
    public String name;
    @XmlTransient
    public int age;

    private String gender;

    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

 

在上面的配置中,Person的name和gender属性可以被绑定到xml中。 注意gender之所以会被绑定并不是因为getter和setter对,而是应为FIELD级别会将private的属性也绑定。

 

以上是关于JAXB的@XmlElement注解的主要内容,如果未能解决你的问题,请参考以下文章

在我的课堂上,我应该在哪里放置@XmlElement 注解?

JAXB实现java对象与xml之间转换

如何使用 JAXB 创建没有价值的 XmlElement

JAXB - Java / XMLValue和XMLElement冲突

JAXB - 忽略中间元素

JAXB(新)注释