应用场景:通过http接口发送xml报文和接收xml报文,针对不同的接口报文xml对应不同的JavaBean,更加适合商业业务的扩展。
准备报文XML:
<?xml version="1.0" encoding="GBK"?>
<Package>
<Header>
<UUID>94d14276-9eed-45ee-9fc5-5cc079ada6e5</UUID>
<UserName>Username</UserName>
<PassWord>Password</PassWord>
<InfoSource>WX</InfoSource>
<SendTime></SendTime>
<RequestType>xFire</RequestType>
</Header>
<Request>
<bankserialno>1234567890</bankserialno>
<certificatetype>1</certificatetype>
<certificateno>110101199606020013</certificateno>
<depositacct>111111111111111111</depositacct>
<depositacctname>张三</depositacctname>
<contractno>222222222</contractno>
<applicationamount>100</applicationamount>
</Request>
</Package>
XML转化工具类:XstreamUtil.java
package xstream.util;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
public class XstreamUtil {
public static final String xmlHead = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n";
public static final XStream xStream = new XStream();
static{
xStream.autodetectAnnotations(true);
}
/**
* 把实体类转换为xml字符串
*
* @param obj
* @return
*/
public static String toXml(Object obj) {
return xmlHead + xStream.toXML(obj);
}
/**
* 把xml文件转换为实体类
*
* @param <T>
* @param xmlStr
* @param cls
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T toBean(String xmlStr, Class<T> cls) {
XStream xs = new XStream(new DomDriver());
xs.processAnnotations(cls);
xs.autodetectAnnotations(true);
return (T) xs.fromXML(xmlStr);
}
}
针对每种报文都有共同的Header,不同的Request,可以提取公共实体类:RequestPackage.java
package xstream.dto;
import xstream.util.XstreamUtil;
import com.thoughtworks.xstream.annotations.XStreamAlias;
public class RequestPackage {
private RequestHeader Header = new RequestHeader();
// 把本类转为xml
public String toXml() {
return XstreamUtil.toXml(this);
}
@XStreamAlias("Header")
public static class RequestHeader {
private String UUID = java.util.UUID.randomUUID().toString();
private String UserName = "UserName";
private String PassWord = "PassWord";
private String InfoSource = "WX";
private String RequestType; // 请求服务类型
public String getRequestType() {
return RequestType;
}
public void setRequestType(String requestType) {
RequestType = requestType;
}
}
public RequestHeader getHeader() {
return Header;
}
public void setHeader(RequestHeader header) {
Header = header;
}
}
业务逻辑实体类:BusinessObjectRequest.java
package xstream.dto;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("Package")
public class BusinessObjectRequest extends RequestPackage {
private Request Request = new Request();
@XStreamAlias("Request")
public static class Request {
private String bankserialno;
private String certificatetype;
private String certificateno;
private String depositacct;
private String depositacctname;
private String contractno;
private String applicationamount;
// getters and setters
}
// getters and setters
}
测试类:Client.java
package xstream.client;
import xstream.dto.BusinessObjectRequest;
public class Client {
public static void main(String[] args) {
BusinessObjectRequest request = new BusinessObjectRequest();
request.getHeader().setRequestType("xFire");
request.getRequest().setBankserialno("1234567890");
request.getRequest().setCertificatetype("1");
request.getRequest().setCertificateno("110101199606020013");
request.getRequest().setDepositacct("111111111111111111");
request.getRequest().setDepositacctname("张三");
request.getRequest().setContractno("222222222");
request.getRequest().setApplicationamount("100");
String xml = request.toXml();
System.out.println(xml);
}
}
接口返回XML:
<?xml version="1.0" encoding="GBK"?>
<Package>
<Header>
<RequestType>xFire</RequestType>
<UUID>846c3feb-15e0-4d03-9fec-3ed47e46073e</UUID>
<ResponseCode>Y</ResponseCode>
</Header>
<Response>
<Status>0</Status>
<Msg>OK</Msg>
<ContInfo>
<bankserialno>1234567890</bankserialno>
<certificatetype>1</certificatetype>
<certificateno>110101199606020013</certificateno>
<depositacct>111111111111111111</depositacct>
<depositacctname>张三</depositacctname>
<contractno>222222222</contractno>
<applicationamount>100</applicationamount>
</ContInfo>
</Response>
</Package>
公共头部:ResponsePackage.java
package xstream.dto;
import com.thoughtworks.xstream.annotations.XStreamAlias;
public class ResponsePackage {
private ResponseHead Header;
@XStreamAlias("Header")
public class ResponseHead {
private String RequestType;
private String UUID;
private String ResponseCode;
@Override
public String toString() {
return "ResponseHead=[RequestType=" + RequestType + ", UUID="
+ UUID + ", ResponseCode=" + ResponseCode + "]";
}
}
@Override
public String toString() {
return "[Header=" + Header + "]";
}
}
返回Response: BusinessObjectResponse.java
package xstream.dto;
import com.thoughtworks.xstream.annotations.XStreamAlias;
@XStreamAlias("Package")
public class BusinessObjectResponse extends ResponsePackage {
public Response Response;
@XStreamAlias("Response")
public class Response {
private String Status;
private String Msg;
private ContInfo ContInfo;
@Override
public String toString() {
return "Response [Status=" + Status + ", Msg=" + Msg
+ "," + ContInfo + "]";
}
}
@XStreamAlias("ContInfo")
public class ContInfo {
private String bankserialno;
private String certificatetype;
private String certificateno;
private String depositacct;
private String depositacctname;
private String contractno;
private String applicationamount;
@Override
public String toString() {
return "ContInfo=[bankserialno=" + bankserialno
+ ", certificatetype=" + certificatetype
+ ", certificateno=" + certificateno + ", depositacct="
+ depositacct + ", depositacctname=" + depositacctname
+ ", contractno=" + contractno + ", applicationamount="
+ applicationamount + "]";
}
}
@Override
public String toString() {
return "[" + Response + super.toString() + "]";
}
}
测试类:Client1.java
package xstream.client;
import xstream.dto.BusinessObjectResponse;
import xstream.util.XstreamUtil;
public class Client1 {
public static void main(String[] args) {
String str = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
"<Package>\n" +
"\t<Header>\n" +
"\t\t<RequestType>xFire</RequestType>\n" +
"\t\t<UUID>846c3feb-15e0-4d03-9fec-3ed47e46073e</UUID>\n" +
"\t\t<ResponseCode>Y</ResponseCode>\n" +
"\t</Header>\n" +
"\t<Response>\n" +
"\t <Status>0</Status>\n" +
"\t <Msg>OK</Msg>\n" +
"\t\t<ContInfo>\n" +
"\t\t\t<bankserialno>1234567890</bankserialno>\n" +
"\t\t\t<certificatetype>1</certificatetype>\n" +
"\t\t\t<certificateno>110101199606020013</certificateno>\n" +
"\t\t\t<depositacct>111111111111111111</depositacct>\n" +
"\t\t\t<depositacctname>张三</depositacctname>\n" +
"\t\t\t<contractno>222222222</contractno>\n" +
"\t\t\t<applicationamount>100</applicationamount>\n" +
"\t\t</ContInfo>\n" +
"\t</Response>\n" +
"</Package>";
BusinessObjectResponse response = XstreamUtil.toBean(str, BusinessObjectResponse.class);
System.out.println(response);
}
}
引用的jar包:xstream-[version].jar、xmlpull-[version].jar