记录开发日常的点滴,成为更棒的程序员
引用 https://blog.csdn.net/wn084/article/details/80853587
使用场景
编写webservice接口的时候,使用JAXB使代码量大大减少,增加工作效率
JAXB
Java Architecture for XML Binding 将XML模式绑定到Java,可以把一个Java对象快速转成XML格式,或者将一个XML格式快速转为Java对象
基础注解介绍
@XmlAccessorType
决定哪些字段或哪些get/set方法对应的字段会被映射为xml元素,需要注意的是字段或get/set方法的访问权限(public/private)会影响字段是否被映射为xml元素
包和类级别的注解
属性
value:XmlAccessType的枚举类型里的值
- XmlAccessType.PROPERTY
对应字段只要有get/set方法(缺一不可)就可以自动映射成XML
没有get/set方法,在字段上使用@XmlElement注解,不可同时存在 - XmlAccessType.FIELD
每个非静态字段都会被映射成XML元素,就算没有get/set和@XmlElement注解 - XmlAccessType.PUBLIC_MEMBER (该值为默认值)
每个public字段或者public的get/set方法对,都会被映射成XML元素,不可同时存在 - XmlAccessType.NONE:
任何字段都不发生映射
@XmlRootElement
将类映射为xml全局元素,也就是根元素
类级别的注解
属性
name:指定生成元素的名字,若不指定则默认使用类名小写作为元素名
nameSpace:指定生成的元素所属的命名空间
实例
java代码
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlRootElement(name = "response")
public class ZyDataIcdResVo extends ResponseVo {
public static final String ERROR="-1";
public static final String SUCCESS="1";
private String code=SUCCESS;
private String msg="成功";
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
生成结果
<response>
<code>-1</code>
<msg>请检查入参格式</msg>
</response>
@XmlElement
该注解可以将被注解的字段(非静态),或者被注解的get/set方法对应的字段映射为本地元素,也就是子元素
字段,方法,参数级别的注解
属性
name:指定生成元素的名字,默认使用字段名或get/set方法去掉前缀剩下部分小写作为元素名
namespace:指定该元素所属的命名空间
nillable:指定元素的文本值是否可以为空,默认为false
required:指定该元素是否必须出现,默认为false
defaultValue:指定该元素默认的文本值
@XmlElementWrapper
围绕被映射的xml元素生成包装元素。主要用在集合对象映射后生成包装映射结果的xml元素。
字段和方法级别的注解
属性
name、nillable、namespace、required 用法同上
实例
java代码
private List<ZyDataIcdInfo> data;
public List<ZyDataIcdInfo> getData() {
return data;
}
@XmlElementWrapper(name = "data")
@XmlElement(name="result")
public void setData(List<ZyDataIcdInfo> data) {
this.data = data;
}
生成结果
<data>
<result>
<backup1></backup1>
<backup2></backup2>
<backup3></backup3>
<backup4></backup4>
<backup5></backup5>
</result>
</response>
@XmlType
指定生成元素的顺序
类级别的注解
属性
propOrder:生成的xml元素必须按照propOrder指定的顺序出现,也就间接实现了排序
实例
java代码
@XmlAccessorType(XmlAccessType.PROPERTY)
@XmlType(name = "", propOrder = {
"backup1",
"backup2",
"backup3",
"backup4",
"backup5"
})
public class ZyDataIcdInfo implements Serializable {
}
@XmlJavaTypeAdapter
解决日期,数字等格式化的问题
包、类、字段,方法、参数级别的注解
属性
XXX.class:自定义一个适配器,继承XmlAdapter类,实现里面的marshal和unmarshal方法,并在该注解上引用
public class TimestampAdapter extends XmlAdapter<Date, Timestamp> {
public Date marshal(Timestamp t) {
return new Date(t.getTime());
}
public Timestamp unmarshal(Date d) {
return new Timestamp (d.getTime());
}
}
public class InfoDTO {
private Timestamp createTime;
...
@XmlJavaTypeAdapter(Timestamp.class)
public Timestamp getCreateTime() {
return this.createTime;
}
}