JAXB(Java Architecture for
XML Binding) 是一个业界的标准,是一项可以根据XML
Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档。从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地
结合XML数据和处理函数。
好了,废话少说,看看简单的
例子。
介绍下相关的类。SmsDeliverReq是一个请求对象,类中有两个属性,分别为ReqHeader reqHeader和SmsBody smsBody类型都为
自定义类型。这两个类中的属性都为基本数据类型。
现在需要做的是将SmsDeliverReq的实例转换为xml和将xml转换为SmsDeliverReq实例。
ReqHeader.java
class="java">package cn.mr.javabeanxml;
import javax.xml.bind.annotation.XmlElement;
/**
* 请求头对象
* @author xuejiangtao
* Jul 25, 2013 9:33:57 PM
*/
public class ReqHeader {
/**
* 系统编号
*/
private String sysId;
/**
* 鉴权码
*/
private String authCode;
/**
* 流水号
*/
private String reqNo;
public String getSysId() {
return sysId;
}
@XmlElement(name="SYSID")
public void setSysId(String sysId) {
this.sysId = sysId;
}
public String getAuthCode() {
return authCode;
}
@XmlElement(name="AUTHCODE")
public void setAuthCode(String authCode) {
this.authCode = authCode;
}
public String getReqNo() {
return reqNo;
}
@XmlElement(name="REQNO")
public void setReqNo(String reqNo) {
this.reqNo = reqNo;
}
}
SmsBody.java
package cn.mr.javabeanxml;
import javax.xml.bind.annotation.XmlElement;
/**
* 请求内容
* @author xuejiangtao
* Jul 25, 2013 9:34:16 PM
*/
public class SmsBody {
/**
* 短信内容
*/
private String content;
/**
* 手机号
*/
private String sourceAddr;
/**
* 服务代码
*/
private String destAddr;
public String getContent() {
return content;
}
@XmlElement(name="CONTENT")
public void setContent(String content) {
this.content = content;
}
public String getSourceAddr() {
return sourceAddr;
}
@XmlElement(name="SOURCEADDR")
public void setSourceAddr(String sourceAddr) {
this.sourceAddr = sourceAddr;
}
public String getDestAddr() {
return destAddr;
}
@XmlElement(name="DESTADDR")
public void setDestAddr(String destAddr) {
this.destAddr = destAddr;
}
}
SmsDeliverReq.java
package cn.mr.javabeanxml;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
* 请求对象
* @author xuejiangtao
* Jul 25, 2013 9:34:26 PM
*/
@XmlRootElement(name="SMSDELIVERREQ")
public class SmsDeliverReq {
private ReqHeader reqHeader;
private SmsBody smsBody;
@XmlElement(name="REQHEADER")
public ReqHeader getReqHeader() {
return reqHeader;
}
public void setReqHeader(ReqHeader reqHeader) {
this.reqHeader = reqHeader;
}
@XmlElement(name="SMSBODY")
public SmsBody getSmsBody() {
return smsBody;
}
public void setSmsBody(SmsBody smsBody) {
this.smsBody = smsBody;
}
}
Test.java
package cn.mr.javabeanxml.xml2bean;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import cn.mr.javabeanxml.ReqHeader;
import cn.mr.javabeanxml.SmsBody;
import cn.mr.javabeanxml.SmsDeliverReq;
public class Test {
/**
* XML转换为javabean
* Jul 25, 2013 9:39:05 PM xuejiangtao添加此方法
* @param <T>
* @param xml
* @param t
* @return
* @throws JAXBException
*/
public static <T> T xmlToBean(String xml, T t) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(t.getClass());
Unmarshaller um = context.createUnmarshaller();
StringReader sr = new StringReader(xml);
t = (T) um.unmarshal(sr);
return t;
}
/**
* javabean转换为XML
* Jul 25, 2013 9:39:09 PM xuejiangtao添加此方法
* @param smsDeliverReq
* @return
* @throws JAXBException
*/
public static <T> StringWriter beanToXml(T t) throws JAXBException {
JAXBContext context = JAXBContext.newInstance(t.getClass());
Marshaller m = context.createMarshaller();
StringWriter sw = new StringWriter();
m.marshal(t, sw);
System.out.println(sw.toString());
return sw;
}
/**
* Jul 24, 2013 10:12:39 PM xuejiangtao添加此方法
* @param args
* @throws JAXBException
*/
public static void main(String[] args) throws JAXBException {
ReqHeader reqHeader = new ReqHeader();
reqHeader.setReqNo("111");
reqHeader.setAuthCode("DDDD");
reqHeader.setSysId("jjj");
SmsBody smsBody = new SmsBody();
smsBody.setContent("类容讷讷");
smsBody.setDestAddr("1589594");
smsBody.setSourceAddr("9999");
SmsDeliverReq smsDeliverReq = new SmsDeliverReq();
smsDeliverReq.setReqHeader(reqHeader);
smsDeliverReq.setSmsBody(smsBody);
StringWriter sw = beanToXml(smsDeliverReq);
SmsDeliverReq xmlToBean = xmlToBean(sw.toString(), smsDeliverReq);
// System.out.println(xmlToBean.toString());
}
}
一下内容来自百度百科,个人觉得非常重要。
JDK中JAXB相关的重要Class和Interface:
JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。
Marshaller
接口,将Java对象
序列化为XML数据。
Unmarshaller接口,将XML数据反序列化为Java对象。
JDK中JAXB相关的重要Annotation:
@XmlType,将Java类或
枚举类型映射到XML模式类型
@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。
@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。
@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。
@XmlElementWrapper ,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的
XML元素(称为包装器)。
@XmlRootElement,将Java类或枚举类型映射到XML元素。
@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。
@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。
其他:
对于要序列化(marshal)为XML的Java类,
绝不能把成员变量声明为public,否则运行将抛出
异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。
对于JAXB相关的重要Annotation的声明,
如@Xml.....,可以放在成员变量的setter()或getter()方法上,两者中任选其一即可,但决不能放在成员变量上,否则运行将抛出异常com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException。