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, 它的值有 FIELD
, PROPERTY
, PUBLIC_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 注解?