Xstream是一种OXMapping 技术,是用来处理XML文件序列化的框架,在将javaBean序列化,或将XML文件反序列化的时候,不需要其它辅助类和映射文件,使得XML序列化不再繁索。
官网地址 http://xstream.codehaus.org/ 里面有很多详细的例子及jar包下载;
下载二进制开发包1.4.7版本:Binary distribution
jar包选用,目前选择这个三个就够用了:
xstream-1.4.7.jar
jettison-1.2.jar
xpp3_min-1.1.4c.jar
我使用的是1.3.1版本,jar包选用都一样,项目中需要使用在axis2中发送xml类型的字符串格式,我就用了XStream类转换处理xml和java实体类,以下是实战代码 :
特别注意:属性名与节点名称对应,区分大小写,如果写错会报 CannotResolveClassException 异常,转换时节点的名称没有在节点实体类属性中找到也会报这个错误!
节点实体类:
public class Root implements Serializable { private TransData TransData; //根节点 //getter setter } public class TransData implements Serializable { private TransHead TransHead; //报文头 private TransBody TransBody; //报文体 //getter setter } public class TransHead implements Serializable { private String TransType; //交易码 private Date TransDate; //数据传送日期 private String TransTime; //时间传送时间 private Reserve Reserve; //保留域 //getter setter } public class Reserve implements Serializable{ private String Resv1; //保留域 private String Resv2; private String Resv3; private String Resv4; private String Resv5; //getter setter } public class TransBody implements Serializable{ private String AgentCode; //代理人代码 必须 private String AgentLicNo; //代理人协议号 必须 private String AgentGroup;//销售人员所属机构 非必须 private String Resv1; //以下是保留域 private String Resv2; private String Resv3; private String Resv4; private String Resv5; //getter setter }
测试代码()
一、节点实体类转换xml格式
import java.sql.Date; import com.newtouch.component.axis2.model.reqeust.Reserve; import com.newtouch.component.axis2.model.reqeust.Root; import com.newtouch.component.axis2.model.reqeust.TransBody; import com.newtouch.component.axis2.model.reqeust.TransData; import com.newtouch.component.axis2.model.reqeust.TransHead; import com.thoughtworks.xstream.XStream; public class Tests { public static void main(String[] args) { XStream xstream = new XStream(); /* * 设置别名,如果不设置xml中父节点名称会类的路径名称,别名区分大小写 * 如Reserve节点会是com.newtouch.component.axis2.model.reqeust.Reserve */ xstream.alias("Reserve", Reserve.class); xstream.alias("TransData", TransData.class); xstream.alias("TransHead", TransHead.class); xstream.alias("TransBody", TransBody.class); xstream.alias("Root", Root.class); //常见节点元素设置各种依赖关系 TransBody tb = new TransBody(); tb.setAgentCode("113313"); tb.setAgentLicNo("313"); tb.setAgentGroup("121"); tb.setResv1(""); tb.setResv2(""); tb.setResv3(""); tb.setResv4(""); tb.setResv5(""); Reserve r = new Reserve(); r.setResv1(""); r.setResv2(""); r.setResv3(""); r.setResv4(""); r.setResv5(""); TransHead th = new TransHead(); th.setTransDate(new Date(System.currentTimeMillis())); th.setTransTime("18:20:00"); th.setTransType("211311311133"); th.setReserve(r); TransData td = new TransData(); td.setTransBody(tb); td.setTransHead(th); Root rt = new Root(); rt.setTransData(td); String xml = xstream.toXML(rt); System.out.println(xml); } }打印结果 :
<Root> <TransData> <TransHead> <TransType>211311311133</TransType> <TransDate>2014-04-18</TransDate> <TransTime>18:20:00</TransTime> <Reserve> <Resv1></Resv1> <Resv2></Resv2> <Resv3></Resv3> <Resv4></Resv4> <Resv5></Resv5> </Reserve> </TransHead> <TransBody> <AgentCode>113313</AgentCode> <AgentLicNo>313</AgentLicNo> <AgentGroup>121</AgentGroup> <Resv1></Resv1> <Resv2></Resv2> <Resv3></Resv3> <Resv4></Resv4> <Resv5></Resv5> </TransBody> </TransData> </Root>
二 xml转换为节点实体类:
public class TEST { public static void main(String[] args) throws Exception { String xml = "<Root>"+ "<TransData>"+ "<TransHead>"+ "<TransType>211311311133</TransType>"+ "<TransDate>2014-04-16</TransDate>"+ "<TransTime>18:20:00</TransTime>"+ "<Reserve>"+ "<Resv1></Resv1>"+ "<Resv2></Resv2>"+ "<Resv3></Resv3>"+ "<Resv4></Resv4>"+ "<Resv5></Resv5>"+ "</Reserve>"+ "</TransHead>"+ "<TransBody>"+ "<AgentCode>113313</AgentCode>"+ "<AgentLicNo>313</AgentLicNo>"+ "<AgentGroup>机构</AgentGroup>"+ "<Resv1></Resv1>"+ "<Resv2></Resv2>"+ "<Resv3></Resv3>"+ "<Resv4></Resv4>"+ "<Resv5></Resv5>"+ "</TransBody>"+ "</TransData>"+ "</Root>"; //这里需要说明下如果不设置和节点名称对应的节点实体类,
//会报错转换错误CannotResolveClassException
XStream xstream = new XStream();
xstream.alias("Reserve", Reserve.class); xstream.alias("TransData", TransData.class); xstream.alias("TransHead", TransHead.class); xstream.alias("TransBody", TransBody.class); xstream.alias("Root", Root.class); Root root = (Root)xstream.fromXML(xml);//设置各个别名然后直接转换Root就够了 System.out.println(root.getTransData().getTransHead().getTransTime()); } }
输出结果:
18:20:00
这样Java实体类和xml格式相互转换就完成了,等有空了再写 axis2 部署webservice接口实战,用的就是例子中传入的xml格式