[CXF REST标准实战系列] 一、JAXB xml与javaBean的转换
Writer:BYSocket(泥沙砖瓦浆木匠)
Reprint it anywhere u want. 文章Points: 1、不认识到犯错,然后得到永久的教训。 2、认识JAXB 3、代码实战
? 1、不认识到犯错,然后得到永久的教训。? 也不是所谓的教训吧,真正的教训来自于对错误的剖析理解很深刻。然后有种“吃一堑,长一智”的感觉才叫教训。近日和团队工头们用CXF3.0和Spring4.0开发一个平台,模仿着第三方支付,用xml进行数据交互。 ? 因此,搜了下。果断用了dom4j,用自己键盘papa打了个叫做XmlOjbUtil的工具类。后来百度下,虽然不是万能的百度。但也要表扬下,发现人家搭着REST的CXF却集成了Jaxb。 ? 果断抛弃了!(有时候决定就需要这么果断。) 先做个铺垫,我们先说下一些知识点: ? CXF实现webService项目,有两种模式可以开发。Jax-ws实现经典的Web Service和Jax-rs实现REST标准。在Java EE 5/6中,Jaxb可以方便地集成,负责xml与JavaBean的映射。其实Jaxb也可以作为xml解析的一种技术。 2、认识JAXB? JAXB(Java Architecture for XML Binding)是根据XML Schema映射到JavaBean的技术。过程中,JAXB将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到 XML实例文档。 ? 在JDK1.6时,JAXB 2.0是JDK 1.6的组成部分。JAXB 2.2.3是JDK 1.7的组成部分。 提前修一下文档知识吧: ? JDK中JAXB相关的重要Class和Interface:? 1、JAXBContext类,是应用的入口,用于管理XML/Java绑定信息。 ? 2、Marshaller接口,将Java对象序列化为XML数据。 ? 3、Unmarshaller接口,将XML数据反序列化为Java对象。 ?? JDK中JAXB相关的重要Annotation:??1、@XmlType,将Java类或枚举类型映射到XML模式类型 ??2、@XmlAccessorType(XmlAccessType.FIELD) ,控制字段或属性的序列化。FIELD表示JAXB将自动绑定Java类中的每个非静态的(static)、非瞬态的(由@XmlTransient标注)字段到XML。其他值还有XmlAccessType.PROPERTY和XmlAccessType.NONE。 ??3、@XmlAccessorOrder,控制JAXB 绑定类中属性和字段的排序。 ??4、@XmlJavaTypeAdapter,使用定制的适配器(即扩展抽象类XmlAdapter并覆盖marshal()和unmarshal()方法),以序列化Java类为XML。 ??5、@XmlElementWrapper?,对于数组或集合(即包含多个元素的成员变量),生成一个包装该数组或集合的XML元素(称为包装器)。 ??6、@XmlRootElement,将Java类或枚举类型映射到XML元素。 ??7、@XmlElement,将Java类的一个属性映射到与属性同名的一个XML元素。 ??8、@XmlAttribute,将Java类的一个属性映射到与属性同名的一个XML属性。 ?
?3、代码实战我们既然要设计报文,所以我这边拿出来一个注册的Bean的设计。首先我们设计注册的Bean,代码如下: DataBean.java
RegBean.java |
<
font
size
=
"4"
face
"宋体"
>package com.xidian.wq.imaopay.model.mesdata.base;
?
?
import javax.xml.bind.annotation.XmlRootElement;
?
/**
*
* @author BYSocket
* 报文体-[用户注册报文体信息]
*/
@XmlRootElement(name="reg_bean")
public class RegBean
{
???? ?
// 注册报文体流水号(reg_data_sn)
private String reg_sn;
???? ?
////用户编号(user_info_id)
// 业务系统的用户编号只做记录不在支付系统中逻辑处理
private Integer user_id;
?
// 注册账号(reg_account)
private String reg_no;
// 注册途径(reg_way)
private String reg_way;
???? ?
// 保留域
private String reserve;
???? ?
////提交日期(set_time)
// 业务系统上传
private String set_time;
???? ?
// 后台信息返回路径(return_url)
private String ret_url;
???? ?
// 备注
String remarks;
?
public String getReg_sn()
{
return reg_sn;
}
?
public void setReg_sn(String reg_sn)
{
this.reg_sn = reg_sn;
}
?
public Integer getUser_id()
return user_id;
public void setUser_id(Integer user_id)
this.user_id = user_id;
public String getReg_no()
return reg_no;
public void setReg_no(String reg_no)
this.reg_no = reg_no;
public String getReg_way()
return reg_way;
public void setReg_way(String reg_way)
this.reg_way = reg_way;
public String getReserve()
return reserve;
public void setReserve(String reserve)
this.reserve = reserve;
public String getSet_time()
return set_time;
public void setSet_time(String set_time)
this.set_time = set_time;
public String getRet_url()
return ret_url;
public void setRet_url(String ret_url)
this.ret_url = ret_url;
public String getRemarks()
return remarks;
public void setRemarks(String remarks)
this.remarks = remarks;
}
?
}
</
font
>
|
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import com.xidian.wq.imaopay.model.mesdata.base.DataBean;
import com.xidian.wq.imaopay.model.mesdata.base.RegBean;
@XmlRootElement( name = "msg_bean" )
public class MsgRegBean
{
private DataBean dataBean;
????
?
private List<
RegBean
> regBeans;
????
?
public DataBean getDataBean()
{
return dataBean;
}
@XmlElement(name = "data_bean")
public void setDataBean(DataBean dataBean)
{
this.dataBean = dataBean;
}
@XmlElementWrapper(name = "reg_beans")?
@XmlElement(name = "reg_bean")
public List<
> getRegBeans()
{
return regBeans;
}
public void setRegBeans(List<
> regBeans)
{
this.regBeans = regBeans;
}
然后针对的我们用Jaxb实现一个转换的Util类:
import java.io.StringReader;?
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBContext;?
import javax.xml.bind.JAXBException;?
import javax.xml.bind.Marshaller;?
import javax.xml.bind.Unmarshaller;?
import com.alibaba.fastjson.JSON;
import com.xidian.wq.imaopay.model.mesdata.MsgRegBean;
import com.xidian.wq.imaopay.model.mesdata.base.DataBean;
import com.xidian.wq.imaopay.model.mesdata.base.RegBean;
/**
*??
* @author BYSocket
* Jaxb2.0 处理Xml与Object转换
*
*/
public class JaxbObjectAndXmlUtil
{?
??????
?
/**
?????
* @param xmlStr 字符串
* @param c 对象Class类型
* @return 对象实例
*/
@SuppressWarnings("unchecked")
public static <
T
> T xml2Object(String xmlStr,Class<
> c)
{?
try
{?
????????????
JAXBContext context = JAXBContext.newInstance(c);?
Unmarshaller unmarshaller = context.createUnmarshaller();?
????????????
?
T t = (T) unmarshaller.unmarshal(new StringReader(xmlStr));?
????????????
?
return t;?
????????????
?
} catch (JAXBException e) {? e.printStackTrace();? return null; }?
????????
?
}?
??????
?
/**
* @param object 对象
* @return 返回xmlStr
*/
public static String object2Xml(Object object)
{?
try
{???
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(object.getClass());?
Marshaller? marshal = context.createMarshaller();
????????????
?
marshal.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true); // 格式化输出?
marshal.setProperty(Marshaller.JAXB_ENCODING,"UTF-8");// 编码格式,默认为utf-8?
marshal.setProperty(Marshaller.JAXB_FRAGMENT,false);// 是否省略xml头信息?
marshal.setProperty("jaxb.encoding","utf-8");?
marshal.marshal(object,writer);
????????????
?
return new String(writer.getBuffer());
????????????
?
} catch (Exception e) { e.printStackTrace(); return null;}????
????????
?
}?
????
?
public static void main(String[] args)
?????????
/** 构造测试报文头对象 */
DataBean dataBean = new DataBean();
dataBean.setBatch_no("N20150204");
dataBean.setData_type("000001");
dataBean.setVersion("v1.0");
dataBean.setUser_name("xx");
dataBean.setMsg_sign("未知");
dataBean.setRd_num("6631383");
dataBean.setRd_time("20150204");
dataBean.setK_sign("75CC479AAC09F00BA28F0E968B1BC9D1B90ADCC2");
/** 构造测试报文体对象 */
RegBean regBean = new RegBean();
regBean.setReg_sn("REG20150204");
regBean.setUser_id(12);
regBean.setReg_no("33");
regBean.setReg_way("pc");
regBean.setSet_time("20150204 16:18");
regBean.setRet_url("未知");
regBean.setRemarks("无备注");
????????
?
MsgRegBean msgBean = new MsgRegBean();
List<
> regBeans = new ArrayList<
>();
regBeans.add(regBean);
regBeans.add(regBean);
????????
?
msgBean.setRegBeans(regBeans);
msgBean.setDataBean(dataBean);
????????
?
String xmlStr = JaxbObjectAndXmlUtil.object2Xml(msgBean);//构造报文 XML 格式的字符串
System.out.println("对象转xml报文: n"+xmlStr);
????????
?
MsgRegBean msgBean2 = JaxbObjectAndXmlUtil.xml2Object(xmlStr,MsgRegBean.class);
System.out.println("报文转xml转: n"+JSON.toJSONString(msgBean2));
}
}? </
运行下测试main函数,可以得到如下的输出:
37
对象转xml报文:
<?
xml
version
"1.0"
encoding
"utf-8"
standalone
"yes"
?>
msg_bean
>
data_bean
>
batch_no
>N20150204</
>
data_type
>000001</
>
k_sign
>75CC479AAC09F00BA28F0E968B1BC9D1B90ADCC2</
>
msg_sign
>未知</
>
rd_num
>6631383</
>
rd_time
>20150204</
>
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!