因此,搜了下。果断用了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、认识JAXBJAXB(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
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
package com.xidian.wq.imaopay.model.mesdata.base;
import javax.xml.bind.annotation.XmlRootElement;
/
@author BYSocket
报文头-[报文根本信息]
/
@XmlRootElement(name=\"大众data_bean\"大众)
public class DataBean
{
// 版本信息(data_version)
String version;
////类型(data_type)
// 000001 - 注册[个人信息Post|Respose]
// 000002 - 绑定银行卡[首次绑定,保存个人信息]
// 000003 - 绑定银行卡[二次,校验个人信息]
// 100001 - 支付[钱包支付]
// 100002 - 查询
// 200001
String data_type;
////订单编号(order_id)
// 总长20位, 有字母要用大写
String batch_no;
// 平台账号(platform_account)
String user_name;
////要求状态
// 000
String trans_state;
// 署名信息(msg_sign)
String msg_sign;
// 韶光戳(randomTime)
private String rd_time;
// 随机数(randomNum)
private String rd_num;
// 密钥(keySign)
private String k_sign;
// 保留域
String reserve;
public String getVersion()
{
return version;
}
public void setVersion(String version)
{
this.version = version;
}
public String getData_type()
{
return data_type;
}
public void setData_type(String data_type)
{
this.data_type = data_type;
}
public String getBatch_no()
{
return batch_no;
}
public void setBatch_no(String batch_no)
{
this.batch_no = batch_no;
}
public String getUser_name()
{
return user_name;
}
public void setUser_name(String user_name)
{
this.user_name = user_name;
}
public String getTrans_state()
{
return trans_state;
}
public void setTrans_state(String trans_state)
{
this.trans_state = trans_state;
}
public String getMsg_sign()
{
return msg_sign;
}
public void setMsg_sign(String msg_sign)
{
this.msg_sign = msg_sign;
}
public String getRd_time()
{
return rd_time;
}
public void setRd_time(String rd_time)
{
this.rd_time = rd_time;
}
public String getRd_num()
{
return rd_num;
}
public void setRd_num(String rd_num)
{
this.rd_num = rd_num;
}
public String getK_sign()
{
return k_sign;
}
public void setK_sign(String k_sign)
{
this.k_sign = k_sign;
}
public String getReserve()
{
return reserve;
}
public void setReserve(String reserve)
{
this.reserve = reserve;
}
}
RegBean.java
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
<fontsize=\"大众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>
注册报文体MsgRegBean.java,支持内容的列表。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.xidian.wq.imaopay.model.mesdata;
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<RegBean> getRegBeans()
{
return regBeans;
}
public void setRegBeans(List<RegBean> regBeans)
{
this.regBeans = regBeans;
}
}
然后针对的我们用Jaxb实现一个转换的Util类:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<fontsize=\"大众4\公众face=\"大众宋体\"大众>package com.xidian.wq.imaopay.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<T> 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<RegBean> regBeans = new ArrayList<RegBean>();
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));
}
} </font>
运行下测试main函数,可以得到如下的输出:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
工具转xml报文:
<?xmlversion=\"大众1.0\"大众encoding=\"大众utf-8\公众standalone=\公众yes\公众?>
<msg_bean>
<data_bean>
<batch_no>N20150204</batch_no>
<data_type>000001</data_type>
<k_sign>75CC479AAC09F00BA28F0E968B1BC9D1B90ADCC2</k_sign>
<msg_sign>未知</msg_sign>
<rd_num>6631383</rd_num>
<rd_time>20150204</rd_time>
<user_name>xx</user_name>
<version>v1.0</version>
</data_bean>
<reg_beans>
<reg_bean>
<reg_no>33</reg_no>
<reg_sn>REG20150204</reg_sn>
<reg_way>pc</reg_way>
<remarks>无备注</remarks>
<ret_url>未知</ret_url>
<set_time>20150204 16:18</set_time>
<user_id>12</user_id>
</reg_bean>
<reg_bean>
<reg_no>33</reg_no>
<reg_sn>REG20150204</reg_sn>
<reg_way>pc</reg_way>
<remarks>无备注</remarks>
<ret_url>未知</ret_url>
<set_time>20150204 16:18</set_time>
<user_id>12</user_id>
</reg_bean>
</reg_beans>
</msg_bean>
报文转xml转:
{\公众dataBean\公众:{\"大众batch_no\公众:\"大众N20150204\"大众,\"大众data_type\"大众:\"大众000001\"大众,\公众k_sign\"大众:\公众75CC479AAC09F00BA28F0E968B1BC9D1B90ADCC2\"大众,\公众msg_sign\"大众:\"大众未知\公众,\公众rd_num\公众:\"大众6631383\公众,\公众rd_time\公众:\"大众20150204\公众,\"大众user_name\"大众:\公众xx\公众,\公众version\"大众:\公众v1.0\"大众},\"大众regBeans\"大众:[{\"大众reg_no\"大众:\"大众33\"大众,\"大众reg_sn\"大众:\"大众REG20150204\"大众,\"大众reg_way\"大众:\"大众pc\公众,\"大众remarks\"大众:\"大众无备注\"大众,\"大众ret_url\"大众:\"大众未知\公众,\公众set_time\"大众:\"大众20150204 16:18\公众,\"大众user_id\"大众:12},{\"大众reg_no\"大众:\公众33\"大众,\"大众reg_sn\公众:\公众REG20150204\"大众,\"大众reg_way\"大众:\公众pc\"大众,\"大众remarks\"大众:\"大众无备注\公众,\"大众ret_url\公众:\"大众未知\"大众,\"大众set_time\"大众:\公众20150204 16:18\公众,\公众user_id\"大众:12}]}
代码中间把稳点:
Marshaller.JAXB_FORMATTED_OUTPUT :决定是否在转换成xml时同时进行格式化(即按标签自动换行,否则即是一行的xml) 。
Marshaller.JAXB_ENCODING :xml的编码办法。
Marshaller.JAXB_FRAGMENT :是否省略xml头信息
marshal.setProperty(“jaxb.encoding”, “utf-8″); : 设置编码格式 utf-8