JAXB(Java Architecture for XML Binding) 是一个业界的标准,是用于 XML 绑定的 Java 体系结构(JAXB)是允许将 Java 类映射到 XML 表示形式的软件框架。 JAXB 支持将 Java 对象编组为 XML,然后将 XML 解组为 Java 对象。
JDK11以上已经移除了Jaxb,需要单独引入相应的包
@XmlRootElement
类级别的注解,将类映射为xml全局元素,也就是根元素。就像spring配置文件中的beans。
该注解含有name和namespace两个属性
namespace属性用于指定生成的元素所属的命名空间。name属性用于指定生成元素的名字
@XmlAccessorType
包和类级别的注解。javaEE的API对该注解的解释是:控制字段是否被默认序列化。通俗来讲,就是决定哪些字段或哪些get/set方法对应的字段会被映射为xml元素。
该注解只有一个value属性,可取的值是一个名为XmlAccessType的枚举类型里的值:
1、XmlAccessType.PROPERTY:jaxb绑定类中的每个getter/setter对都将自动绑定到XML,除非用@XmlTransient注释。
注:当使用了该值,只要字段有对应的get/set方法对(注意是成对出现,只有其中一个不会发生映射),不需要使用@XmlElement注解,不论该方法的访问权限是什么(即使是private),jaxb就会将该字段映射成xml元素。不过最好加上@XmlElement注解,get/set方法任选一个即可,都加上会报错。
若在一个字段有set/get方法对但又在字段上添加@XmlElement注解会报属性重复的错误。
若没有set/get方法对,则需要在字段上使用@XmlElement注解才可以映射为xml元素,否则不会发生映射。
若get/set方法上使用了@XmlTransient注解,但想要对应字段发生映射,需要在对应字段上添加@XmlElement注解,此时不会报错,并将该字段映射为xml元素。
2、XmlAccessType.FIELD:jaxb绑定类中的每个非静态、非瞬态字段都将自动绑定到XML,除非使用@XmlTransient进行注释。
注:每个非静态的字段(无论访问权限如何)都会被jaxb映射为xml元素,即使没有get/set方法对,即使没有使用@XmlElement元素,但最好加上该注解以表明该字段要被映射为xml元素。
虽然没有get/set方法对,也会发生映射,但加上get/set方法对也不会报错,因为我们经常会使用这两个方法。但注意,不能再在这两个方法上使用@XmlElement方法,否则会报属性重复的错误。
若在字段上使用了@XmlTransient注解,但还想让该字段发生映射,需要在该字段对应的get/set方法上添加@XmlElement
3、XmlAccessType.PUBLIC_MEMBER (该值为默认值):每个公共getter/setter对和每个公共字段都将自动绑定到XML,除非使用@XmlTransient注释。
注:每个访问权限为public的字段,或者每个访问权限为public的get/set方法对,都会将字段映射为xml元素,即使不使用@XmlElement,但最好加上。不可同时存在public字段和对应的get/set方法对,不然会报属性重复的错误。
若使用@XmlElement注解,需要注意只能在字段或get/set方法添加,两者任选其一,否则会报属性重复的错误。
若字段不为public,get/set方法为public并使用了@XmlTransient,需要在字段上添加@XmlElement才会发生映射。
若字段为public并使用了@XmlTransient,get/set方法对不为public,需要在get/set方法上使用@XmlElement才会映射。
4、XmlAccessType.NONE:任何字段,get/set方法对都不会发生映射,除非使用某些注解,如@XmlElement,@XmlElementWrapper等。
@XmlElement
字段,方法,参数级别的注解。该注解可以将被注解的字段(非静态),或者被注解的get/set方法对应的字段映射为本地元素,也就是子元素。默认使用字段名或get/set方法去掉前缀剩下部分小写作为元素名(在字段名和get/set方法符合命名规范的情况下)
该注解的属性常用的属性有有:name、nillable、required、namespace、defaultValue
name属性可以指定生成元素的名字
nillable属性可以指定元素的文本值是否可以为空,默认为false
required属性可以指定该元素是否必须出现,默认为false
namespace属性可以指定该元素所属的命名空间
defaultValue属性可以指定该元素默认的文本值
@XmlAttribute
字段和方法级别的注解。该注解会将字段或get/set方法对应的字段映射成本类对应元素的属性,属性名默认使用字段名或get/set方法去掉前缀剩下部分首字母小写(在字段名和get/set方法符合命名规范的情况下)
该注解有name,required,namespace三个属性。用法和@XmlElement注解相同
@XmlElementWrapper
字段和方法级别的注解。围绕被映射的xml元素生成包装元素。主要用在集合对象映射后生成包装映射结果的xml元素。
注:该注解可将重复类型的元素包装在一个大的元素里
该注解有name、nillable、namespace、required四个属性,用法同上
@XmlTransient
类,字段,方法级别的注解。可使JAXB在映射xml元素时忽略被注解的类,字段,get/set对应字段。
注:需要注意的是该注解与所有其他JAXB注释相互排斥,也就是说与其他注释连用就会报错。
@XmlValue:
字段和方法级别的注解。该注解的作用,简单理解就是定义xml元素文本值的类型
@XmlJavaTypeAdapter
包、类、字段,方法、参数级别的注解。解决java日期(Date),数字(Number)格式化问题
常用的就是value属性,可自定义一个格式适配器,生成XML时使日期或数字格式化