BSP下单接口

1、xml格式如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <Request service="OrderService" lang="zh-CN">
  4. <Head>BSPdevelop</Head>
  5. <Body>
  6. <Order j_tel="联系电话" j_province="重庆" j_county="渝中区" j_contact="贺雄云" j_company="company1" j_city="重庆市" j_address="重庆重庆市渝中区测试一下" d_tel="电话" d_province="广东省"
    d_county="南山区" d_contact="联系人" d_company="company1" d_city="深圳市" d_address="广东深圳宝安布心一村" pay_method="2" orderid="123456789"
    is_gen_bill_no="1" is_docall="1" express_type="2">
  7. <Cargo name="旧手机"/>
  8. </Order>
  9. </Body>
  10. </Request>

2、构造的xml实体类如下

  1. import java.util.List;
  2.  
  3. import javax.xml.bind.annotation.XmlAttribute;
  4. import javax.xml.bind.annotation.XmlElement;
  5. import javax.xml.bind.annotation.XmlElementWrapper;
  6. import javax.xml.bind.annotation.XmlRootElement;
  7. import javax.xml.bind.annotation.XmlSeeAlso;
  8. import javax.xml.bind.annotation.XmlType;
  9.  
  10. /**
  11. * @ClassName BSPRequest
  12. * @Description bsp接口请求元素
  13. * @author
  14. * @Date 2018年4月20日 下午4:46:04
  15. * @version 1.0.0
  16. * @param <T>
  17. */
  18. @XmlRootElement(name="Request")
  19. //@XmlSeeAlso({OrderServiceBody.class}) //工具类中实例化时如果没有加入泛型对象,也可以在这里利用此注解加入可能用到的所有泛型对象
  20. @XmlType(propOrder = { "head", "body"}) //指明生成xml的标签顺序,写属性名
  21. public class BSPRequest<T> {
  22.  
  23. private String service; //请求接口服务名
  24. private String lang; //响应报文语言,中文简体:zh-CN
  25. private String head; //接入编码:BSPdevelop
  26. private T body; //body:请求数据XML
  27.  
  28. @XmlAttribute(name="service")
  29. public String getService() {
  30. return service;
  31. }
  32.  
  33. public void setService(String service) {
  34. this.service = service;
  35. }
  36.  
  37. @XmlAttribute(name="lang")
  38. public String getLang() {
  39. return lang;
  40. }
  41.  
  42. public void setLang(String lang) {
  43. this.lang = lang;
  44. }
  45.  
  46. @XmlElement(name="Head")
  47. public String getHead() {
  48. return head;
  49. }
  50.  
  51. public void setHead(String head) {
  52. this.head = head;
  53. }
  54.  
  55. @XmlElement(name="Body")
  56. public T getBody() {
  57. return body;
  58. }
  59.  
  60. public void setBody(T body) {
  61. this.body = body;
  62. }
  63.  
  64. }
  1. import javax.xml.bind.annotation.XmlElement;
  2.  
  3. /**
  4. * @ClassName OrderServiceBody
  5. * @Description BSP下单接口请求体
  6. * @author
  7. * @Date 2018年4月20日 下午5:18:28
  8. * @version 1.0.0
  9. */
  10. public class OrderServiceRequestBody {
  11. private BSPOrder order;//order:下单接口请求数据
  12.  
  13. @XmlElement(name="Order")
  14. public BSPOrder getOrder() {
  15. return order;
  16. }
  17.  
  18. public void setOrder(BSPOrder order) {
  19. this.order = order;
  20. }
  21.  
  22. }
  1. import javax.xml.bind.annotation.XmlAttribute;
  2. import javax.xml.bind.annotation.XmlElement;
  3.  
  4. /**
  5. * @ClassName BSPOrder
  6. * @Description 下单(含筛选)接口 Order元素
  7. * @author
  8. * @Date 2018年4月20日 下午4:45:56
  9. * @version 1.0.0
  10. */
  11. public class BSPOrder {
  12. private String orderId; //客户订单号
  13. private int isGenBillNo; //1:要求接口返回顺丰运单号
  14. private String jCompany; //寄件方公司名称
  15. private String jContact; //寄件方联系人
  16. private String jTel; //寄件方联系电话
  17. private String jProvince; //寄件方省
  18. private String jCity; //寄件方城市
  19. private String jCounty; //寄件方区/县
  20. private String jAddress; //寄件方详细地址
  21. private String dCompany; //到件方公司名称
  22. private String dContact; //到件方联系人
  23. private String dTel; //到件方联系电话
  24. private String dProvince; //到件方所在省份
  25. private String dCity; //到件方所在城市
  26. private String dCounty; //到件方所在县/区
  27. private String dAddress; //到件方详细地址
  28. private String custid; //顺丰月结卡号
  29. private int payMethod; //付款方式;1:寄方付 2:收方付 3:第三方付
  30. private String remark; //备注
  31. // private int isGenEletricPic; //是否生成电子运单图片,1为是
  32. private OrderCargo cargo; //order下的cargo元素
  33. private int isDocall; //是否要求通过是否手持终端;通知顺丰收派员收件;1:要求 ;其它为不要求
  34. private int expressType; //顺丰默认是1:顺丰特快,2:顺丰特惠;
  35.  
  36. @XmlAttribute(name="orderid")
  37. public String getOrderId() {
  38. return orderId;
  39. }
  40.  
  41. public void setOrderId(String orderId) {
  42. this.orderId = orderId;
  43. }
  44.  
  45. @XmlAttribute(name="is_gen_bill_no")
  46. public int getIsGenBillNo() {
  47. return isGenBillNo;
  48. }
  49.  
  50. public void setIsGenBillNo(int isGenBillNo) {
  51. this.isGenBillNo = isGenBillNo;
  52. }
  53.  
  54. @XmlAttribute(name="j_company")
  55. public String getjCompany() {
  56. return jCompany;
  57. }
  58.  
  59. public void setjCompany(String jCompany) {
  60. this.jCompany = jCompany;
  61. }
  62.  
  63. @XmlAttribute(name="j_contact")
  64. public String getjContact() {
  65. return jContact;
  66. }
  67.  
  68. public void setjContact(String jContact) {
  69. this.jContact = jContact;
  70. }
  71.  
  72. @XmlAttribute(name="j_tel")
  73. public String getjTel() {
  74. return jTel;
  75. }
  76.  
  77. public void setjTel(String jTel) {
  78. this.jTel = jTel;
  79. }
  80.  
  81. @XmlAttribute(name="j_address")
  82. public String getjAddress() {
  83. return jAddress;
  84. }
  85.  
  86. public void setjAddress(String jAddress) {
  87. this.jAddress = jAddress;
  88. }
  89.  
  90. @XmlAttribute(name="d_company")
  91. public String getdCompany() {
  92. return dCompany;
  93. }
  94.  
  95. public void setdCompany(String dCompany) {
  96. this.dCompany = dCompany;
  97. }
  98.  
  99. @XmlAttribute(name="d_contact")
  100. public String getdContact() {
  101. return dContact;
  102. }
  103.  
  104. public void setdContact(String dContact) {
  105. this.dContact = dContact;
  106. }
  107.  
  108. @XmlAttribute(name="d_tel")
  109. public String getdTel() {
  110. return dTel;
  111. }
  112.  
  113. public void setdTel(String dTel) {
  114. this.dTel = dTel;
  115. }
  116.  
  117. @XmlAttribute(name="d_province")
  118. public String getdProvince() {
  119. return dProvince;
  120. }
  121.  
  122. public void setdProvince(String dProvince) {
  123. this.dProvince = dProvince;
  124. }
  125.  
  126. @XmlAttribute(name="d_city")
  127. public String getdCity() {
  128. return dCity;
  129. }
  130.  
  131. public void setdCity(String dCity) {
  132. this.dCity = dCity;
  133. }
  134.  
  135. @XmlAttribute(name="d_county")
  136. public String getdCounty() {
  137. return dCounty;
  138. }
  139.  
  140. public void setdCounty(String dCounty) {
  141. this.dCounty = dCounty;
  142. }
  143.  
  144. @XmlAttribute(name="d_address")
  145. public String getdAddress() {
  146. return dAddress;
  147. }
  148.  
  149. public void setdAddress(String dAddress) {
  150. this.dAddress = dAddress;
  151. }
  152.  
  153. @XmlAttribute(name="custid")
  154. public String getCustid() {
  155. return custid;
  156. }
  157.  
  158. public void setCustid(String custid) {
  159. this.custid = custid;
  160. }
  161.  
  162. @XmlAttribute(name="pay_method")
  163. public int getPayMethod() {
  164. return payMethod;
  165. }
  166.  
  167. public void setPayMethod(int payMethod) {
  168. this.payMethod = payMethod;
  169. }
  170.  
  171. @XmlAttribute(name="remark")
  172. public String getRemark() {
  173. return remark;
  174. }
  175.  
  176. public void setRemark(String remark) {
  177. this.remark = remark;
  178. }
  179.  
  180. @XmlElement(name="Cargo",required = true)
  181. public OrderCargo getCargo() {
  182. return cargo;
  183. }
  184.  
  185. public void setCargo(OrderCargo cargo) {
  186. this.cargo = cargo;
  187. }
  188.  
  189. @XmlAttribute(name="j_province")
  190. public String getjProvince() {
  191. return jProvince;
  192. }
  193.  
  194. public void setjProvince(String jProvince) {
  195. this.jProvince = jProvince;
  196. }
  197.  
  198. @XmlAttribute(name="j_city")
  199. public String getjCity() {
  200. return jCity;
  201. }
  202.  
  203. public void setjCity(String jCity) {
  204. this.jCity = jCity;
  205. }
  206.  
  207. @XmlAttribute(name="j_county")
  208. public String getjCounty() {
  209. return jCounty;
  210. }
  211.  
  212. public void setjCounty(String jCounty) {
  213. this.jCounty = jCounty;
  214. }
  215.  
  216. @XmlAttribute(name="is_docall")
  217. public int getIsDocall() {
  218. return isDocall;
  219. }
  220.  
  221. public void setIsDocall(int isDocall) {
  222. this.isDocall = isDocall;
  223. }
  224.  
  225. @XmlAttribute(name="express_type")
  226. public int getExpressType() {
  227. return expressType;
  228. }
  229.  
  230. public void setExpressType(int expressType) {
  231. this.expressType = expressType;
  232. }
  233.  
  234. }
  1. import javax.xml.bind.annotation.XmlAttribute;
  2. import javax.xml.bind.annotation.XmlElement;
  3.  
  4. /**
  5. * @ClassName OrderCargo
  6. * @Description 元素<请求>Order/Cargo
  7. * @author
  8. * @Date 2018年4月20日 下午4:46:45
  9. * @version 1.0.0
  10. */
  11. public class OrderCargo {
  12. private String name; //货物名称:旧手机
  13.  
  14. @XmlAttribute(name="name")
  15. public String getName() {
  16. return name;
  17. }
  18.  
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. }

3、jaxb的工具类

  1. import java.io.StringReader;
  2. import java.io.StringWriter;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5.  
  6. import javax.xml.bind.JAXBContext;
  7. import javax.xml.bind.Marshaller;
  8. import javax.xml.bind.Unmarshaller;
  9. /**
  10. * @ClassName JaxbXmlUtil
  11. * @Description Jaxb工具类 xml和java类相互转换
  12. * @author
  13. * @Date 2018年4月20日 下午4:45:34
  14. * @version 1.0.0
  15. */
  16. public class JaxbXmlUtil {
  17.  
  18. public static final String DEFAULT_ENCODING = "UTF-8";
  19.  
  20. /**
  21. * pojo转换成xml 默认编码UTF-8
  22. *
  23. * @param obj 待转化的对象
  24. * @return xml格式字符串
  25. * @throws Exception JAXBException
  26. */
  27. public static String convertToXml(Object obj) throws Exception {
  28. return convertToXml(obj, DEFAULT_ENCODING);
  29. }
  30.  
  31. /**
  32. * pojo转换成xml
  33. *
  34. * @param obj 待转化的对象
  35. * @param encoding 编码
  36. * @return xml格式字符串
  37. * @throws Exception JAXBException
  38. */
  39. public static String convertToXml(Object obj, String encoding) throws Exception {
  40. String result = null;
  41. JAXBContext context = JAXBContext.newInstance(obj.getClass(), OrderServiceRequestBody.class, RouteServiceRequestBody.class);//指定obj中可以传入的泛型对象,这里BSPRequest<T>使用了泛型,所以必须加入具体可能用到的泛型对象
  42. // JAXBContext context = JAXBContext.newInstance(obj.getClass());
  43. Marshaller marshaller = context.createMarshaller();
  44. // 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
  45. marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
  46. marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
  47.  
  48. StringWriter writer = new StringWriter();
  49. marshaller.marshal(obj, writer);
  50. result = writer.toString();
  51.  
  52. return result;
  53. }
  54.  
  55. /**
  56. * xml转换成JavaBean
  57. *
  58. * @param xml xml格式字符串
  59. * @param t 待转化的对象
  60. * @return 转化后的对象
  61. * @throws Exception JAXBException
  62. */
  63. @SuppressWarnings("unchecked")
  64. public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
  65. T obj = null;
  66. JAXBContext context = JAXBContext.newInstance(t);
  67. Unmarshaller unmarshaller = context.createUnmarshaller();
  68. obj = (T) unmarshaller.unmarshal(new StringReader(xml));
  69. return obj;
  70. }
  71.  
  72. /**
  73. * @Description <body> 标签中其余字符去掉 (TODO这里用一句话描述这个方法的作用)
  74. * @param str
  75. * @return
  76. * @throws Exception
  77. */
  78. public static String StringFilter(String str)throws Exception {
  79. //将<Body xsi:type="orderServiceBody" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">替换为<Body>
  80. String regEx = "<Body(.|\\s)*?>";
  81. Pattern pattern = Pattern.compile(regEx);
  82. Matcher matcher = pattern.matcher(str);
  83. return matcher.replaceAll("<Body>").trim();
  84. }
  85. }

测试下单接口如下

  1. public class XMLTest {
  2. public static void main(String[] args) {
  3. try {
  4. BSPRequest<OrderServiceRequestBody> orderService = new BSPRequest<OrderServiceRequestBody>();
  5. orderService.setHead("BSPdevelop");
  6. orderService.setLang("zh-CN");
  7. orderService.setService("OrderService");
  8.  
  9. BSPOrder order = new BSPOrder();
  10. order.setOrderId("15648154");
  11. order.setIsGenBillNo(1);
  12. order.setjProvince("重庆");
  13. order.setjCity("重庆");
  14. order.setjCounty("璧山区");
  15. order.setjAddress("广东省深圳市宝安区布心一村");
  16. order.setdCompany("公司1");
  17. order.setdContact("联系人");
  18. order.setdTel("电话");
  19. order.setdAddress("地址");
  20. order.setPayMethod(2);
  21.  
  22. order.setjTel("电话");
  23.  
  24. OrderCargo cargo = new OrderCargo();
  25. cargo.setName("旧手机");
  26. order.setCargo(cargo);
  27.  
  28. OrderServiceRequestBody body = new OrderServiceRequestBody();
  29. body.setOrder(order);
  30. orderService.setBody(body);
  31.  
  32. String xml = JaxbXmlUtil.convertToXml(orderService);
  33. System.out.println(xml);
  34. String xmlRequest = JaxbXmlUtil.StringFilter(xml).replace("standalone=\"yes\"", ""); //jaxb默认会生成standalone字符串,如果不想要可以这样替换为空串
  35. System.out.println(xmlRequest);
  36.  
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40.  
  41. }
  42. }

BSP路由查询接口

1、xml格式如下

  1. <Request service='RouteService' lang='zh-CN'>
  2. <Head>BSPdevelop</Head>
  3. <Body>
  4. <RouteRequest
  5. tracking_type='1'
  6. method_type='1'
  7. tracking_number='444003077898'/>
  8. </Body>
  9. </Request>

2、构造的xml实体类如下(请求类和下单一样,只不过具体的请求体不一样)

  1. import javax.xml.bind.annotation.XmlElement;
  2. /**
  3. * @ClassName RouteServiceBody
  4. * @Description 路由查询接口请求体
  5. * @author
  6. * @Date 2018年4月24日 上午10:46:32
  7. * @version 1.0.0
  8. */
  9. public class RouteServiceRequestBody {
  10. private BSPRouteRequest routeRequest; //RouteRequest元素
  11.  
  12. @XmlElement(name="RouteRequest")
  13. public BSPRouteRequest getRouteRequest() {
  14. return routeRequest;
  15. }
  16.  
  17. public void setRouteRequest(BSPRouteRequest routeRequest) {
  18. this.routeRequest = routeRequest;
  19. }
  20.  
  21. }
  1. import javax.xml.bind.annotation.XmlAttribute;
  2.  
  3. /**
  4. * @ClassName BSPRouteRequest
  5. * @Description 路由查询接口RouteRequest元素
  6. * @author
  7. * @Date 2018年4月24日 上午10:48:57
  8. * @version 1.0.0
  9. */
  10. public class BSPRouteRequest {
  11. private int trackingType; //查询号类别,1:顺丰运单号查询;2:客户订单号查询
  12. private String trackingNumber; //查询号
  13.  
  14. @XmlAttribute(name="tracking_type")
  15. public int getTrackingType() {
  16. return trackingType;
  17. }
  18.  
  19. public void setTrackingType(int trackingType) {
  20. this.trackingType = trackingType;
  21. }
  22.  
  23. @XmlAttribute(name="tracking_number")
  24. public String getTrackingNumber() {
  25. return trackingNumber;
  26. }
  27.  
  28. public void setTrackingNumber(String trackingNumber) {
  29. this.trackingNumber = trackingNumber;
  30. }
  31.  
  32. }

3、测试路由查询接口(jaxb工具类和前面一样)

  1. public class XMLTest {
  2. public static void main(String[] args) {
  3. try {
  4. BSPRequest<RouteServiceRequestBody> routeService = new BSPRequest<RouteServiceRequestBody>();
  5. routeService.setHead("BSPdevelop");
  6. routeService.setLang("zh-CN");
  7. routeService.setService("RouteService");
  8. RouteServiceRequestBody body = new RouteServiceRequestBody();
  9. BSPRouteRequest routeRequest = new BSPRouteRequest();
  10. routeRequest.setTrackingType(2);
  11. routeRequest.setTrackingNumber("哈哈");
  12. body.setRouteRequest(routeRequest);
  13. routeService.setBody(body);
  14.  
  15. String xml = JaxbXmlUtil.convertToXml(routeService);
  16. System.out.println(xml);
  17. String xmlRequest = JaxbXmlUtil.StringFilter(xml).replace("standalone=\"yes\"", "");
  18. System.out.println(xmlRequest);
  19.  
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23.  
  24. }
  25. }

这两个都是jaxb将java对象转换为xml的例子,下面讲一个xml转换为java对象的例子。

BSP路由查询接口的响应体XML转换为java对象

1、xml格式如下

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <Response service="RouteService">
  4. <Head>OK</Head>
  5. <Body>
  6. <RouteResponse mailno="444003077899">
  7. <Route accept_time="2015-01-04 10:11:26" accept_address="深圳" remark="已收件" opcode="50"/>
  8. <Route accept_time="2015-01-05 17:41:50" remark="此件签单返还的单号为 123638813181" opcode="922"/>
  9. </RouteResponse>
  10. </Body>
  11. </Response>

2、构造的xml实体类如下

  1. import javax.xml.bind.annotation.XmlAttribute;
  2. import javax.xml.bind.annotation.XmlElement;
  3. import javax.xml.bind.annotation.XmlRootElement;
  4. import javax.xml.bind.annotation.XmlSeeAlso;
  5. import javax.xml.bind.annotation.XmlType;
  6.  
  7. /**
  8. * @ClassName BSPResponse
  9. * @Description bsp响应接口
  10. * @author
  11. * @Date 2018年4月24日 上午11:19:14
  12. * @version 1.0.0
  13. */
  14. @XmlRootElement(name="Response")
  15. public class BSPResponse {
  16. private String service; //响应接口服务名
  17. private String head; //OK:交易成功,只返回Body元素;ERR:交易失败,只返回Error元素; Body元素和Error元素不能同时存在
  18. private BSPError error; //失败时的error元素
  19. private BSPResponseBody body; //响应体
  20.  
  21. @XmlAttribute(name="service")
  22. public String getService() {
  23. return service;
  24. }
  25.  
  26. public void setService(String service) {
  27. this.service = service;
  28. }
  29.  
  30. @XmlElement(name="Head") //例如<Head>OK</Head>这样的用XmlElement注释,所以此注释是填充标签之间的内容;而XmlAttribute是填充开始标签中的属性值
  31. public String getHead() {
  32. return head;
  33. }
  34.  
  35. public void setHead(String head) {
  36. this.head = head;
  37. }
  38.  
  39. @XmlElement(name="ERROR")
  40. public BSPError getError() {
  41. return error;
  42. }
  43.  
  44. public void setError(BSPError error) {
  45. this.error = error;
  46. }
  47.  
  48. @XmlElement(name="Body")
  49. public BSPResponseBody getBody() {
  50. return body;
  51. }
  52.  
  53. public void setBody(BSPResponseBody body) {
  54. this.body = body;
  55. }
  56.  
  57. @Override
  58. public String toString() {
  59. return "BSPResponse [service=" + service + ", head=" + head + ", error=" + error + ", body=" + body + "]";
  60. }
  61.  
  62. }
  1. import javax.xml.bind.annotation.XmlAttribute;
  2. import javax.xml.bind.annotation.XmlValue;
  3.  
  4. /**
  5. * @ClassName BSPError
  6. * @Description 响应Error元素
  7. * @author
  8. * @Date 2018年4月24日 上午11:43:46
  9. * @version 1.0.0
  10. */
  11. public class BSPError {
  12. private int code; //错误代码
  13. private String message; //错误详细信息
  14.  
  15. @XmlAttribute(name="code")
  16. public int getCode() {
  17. return code;
  18. }
  19.  
  20. public void setCode(int code) {
  21. this.code = code;
  22. }
  23.  
  24. @XmlValue //<ERROR code="4001">系统发生数据错误或运行时异常</ERROR>像这样,既有属性值,又有标签内容怎么办呢?就用到XmlValue注释,此注释就是添加内容,不会增加子标签;
  25. public String getMessage() {
  26. return message;
  27. }
  28.  
  29. public void setMessage(String message) {
  30. this.message = message;
  31. }
  32.  
  33. @Override
  34. public String toString() {
  35. return "BSPError [code=" + code + ", message=" + message + "]";
  36. }
  37.  
  38. }
  1. import javax.xml.bind.annotation.XmlElement;
  2.  
  3. /**
  4. * @ClassName BSPResponseBody
  5. * @Description BSP响应体(这里用一句话描述这个类的作用)
  6. * @author 贺雄云
  7. * @Date 2018年4月25日 上午11:41:04
  8. * @version 1.0.0
  9. */
  10. public class BSPResponseBody {
  11. private BSPOrderResponse orderResponse; //下单接口响应体
  12. private BSPRouteResponse routeResponse; //路由查询接口响应体内容
  13.  
  14. @XmlElement(name="OrderResponse")
  15. public BSPOrderResponse getOrderResponse() {
  16. return orderResponse;
  17. }
  18.  
  19. public void setOrderResponse(BSPOrderResponse orderResponse) {
  20. this.orderResponse = orderResponse;
  21. }
  22.  
  23. @XmlElement(name="RouteResponse")
  24. public BSPRouteResponse getRouteResponse() {
  25. return routeResponse;
  26. }
  27.  
  28. public void setRouteResponse(BSPRouteResponse routeResponse) {
  29. this.routeResponse = routeResponse;
  30. }
  31. }

注意:我们前面请求接口例子中,请求接口对象是可以用泛型的,可是我网上找了发现xml转换为javabean时用不了泛型,所以我就在响应体BSPResponseBody中写了多个响应体对象,这里有下单和路由查询两个响应体对象,这样我也不用重复写多个响应接口BSPResponse ,一个响应接口对象中有一个BSPResponseBody响应体对象,响应体对象中有多个不同的响应对象,即使要转换的xml中没有此对象也没关系,不过是转换后的java对象中对应的该对象为空而已,不会影响业务代码。

  1. import java.util.List;
  2.  
  3. import javax.xml.bind.annotation.XmlAttribute;
  4. import javax.xml.bind.annotation.XmlElement;
  5.  
  6. /**
  7. * @ClassName BSPRouteResponse
  8. * @Description 路由查询接口响应元素RouteResponse
  9. * @author
  10. * @Date 2018年4月25日 上午10:37:46
  11. * @version 1.0.0
  12. */
  13. public class BSPRouteResponse {
  14. private String mailNo; //顺丰运单号
  15. private String orderId; //客户订单号,按客户订单号查询时为必填。按顺丰运单号查询时为空。
  16. private List<RouteResponseRoute> routeResponseRouteList; //子元素 RouteResponse/Route,多个
  17.  
  18. @XmlAttribute(name="mailno")
  19. public String getMailNo() {
  20. return mailNo;
  21. }
  22.  
  23. public void setMailNo(String mailNo) {
  24. this.mailNo = mailNo;
  25. }
  26.  
  27. @XmlAttribute(name="orderid")
  28. public String getOrderId() {
  29. return orderId;
  30. }
  31.  
  32. public void setOrderId(String orderId) {
  33. this.orderId = orderId;
  34. }
  35.  
  36. @XmlElement(name="Route")
  37. public List<RouteResponseRoute> getRouteResponseRouteList() {
  38. return routeResponseRouteList;
  39. }
  40.  
  41. public void setRouteResponseRouteList(List<RouteResponseRoute> routeResponseRouteList) {
  42. this.routeResponseRouteList = routeResponseRouteList;
  43. }
  44.  
  45. @Override
  46. public String toString() {
  47. return "BSPRouteResponse [mailNo=" + mailNo + ", orderId=" + orderId + ", routeResponseRouteList="
  48. + routeResponseRouteList + "]";
  49. }
  50.  
  51. }
  1. import java.util.Date;
  2.  
  3. import javax.xml.bind.annotation.XmlAttribute;
  4. import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
  5.  
  6. /**
  7. * @ClassName RouteResponseRoute
  8. * @Description 路由查询接口 响应元素 RouteResponse/Route
  9. * @author
  10. * @Date 2018年4月25日 上午10:50:27
  11. * @version 1.0.0
  12. */
  13. public class RouteResponseRoute implements Comparable<RouteResponseRoute> {
  14. private Date acceptTime; //路由节点发生的时间,格式:YYYY-MM-DD HH24:MM:SS,示例:2012-7-30 09:30:00。
  15. private String acceptAddress; //路由节点发生的地点
  16. private String remark; //路由节点具体描述
  17. private String opcode; //路由节点操作码
  18.  
  19. @XmlAttribute(name="accept_time")
  20. @XmlJavaTypeAdapter(JaxbDateSerializer.class) //日期格式的转换,定义了一个JaxbDateSerializer转换类,使用此注解就可以了
  21. public Date getAcceptTime() {
  22. return acceptTime;
  23. }
  24.  
  25. public void setAcceptTime(Date acceptTime) {
  26. this.acceptTime = acceptTime;
  27. }
  28.  
  29. @XmlAttribute(name="accept_address")
  30. public String getAcceptAddress() {
  31. return acceptAddress;
  32. }
  33.  
  34. public void setAcceptAddress(String acceptAddress) {
  35. this.acceptAddress = acceptAddress;
  36. }
  37.  
  38. @XmlAttribute(name="remark")
  39. public String getRemark() {
  40. return remark;
  41. }
  42.  
  43. public void setRemark(String remark) {
  44. this.remark = remark;
  45. }
  46.  
  47. @XmlAttribute(name="opcode")
  48. public String getOpcode() {
  49. return opcode;
  50. }
  51.  
  52. public void setOpcode(String opcode) {
  53. this.opcode = opcode;
  54. }
  55.  
  56. @Override
  57. public String toString() {
  58. return "RouteResponseRoute [acceptTime=" + acceptTime + ", acceptAddress=" + acceptAddress + ", remark="
  59. + remark + ", opcode=" + opcode + "]";
  60. }
  61.  
  62. @Override
  63. public int compareTo(RouteResponseRoute o) {
  64. long l = this.getAcceptTime().getTime() - o.getAcceptTime().getTime();
  65. if (l > 0) {
  66. return -1;
  67. }else if (l == 0) {
  68. return 0;
  69. }else {
  70. return 1;
  71. }
  72. }
  73.  
  74. }
  1. import java.text.SimpleDateFormat;
  2. import java.util.Date;
  3. import javax.xml.bind.annotation.adapters.XmlAdapter;
  4.  
  5. //日期转化的类
  6. public class JaxbDateSerializer extends XmlAdapter<String, Date> {
  7.  
  8. private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  9.  
  10. @Override
  11. public Date unmarshal(String date) throws Exception {
  12. return dateFormat.parse(date);
  13. }
  14.  
  15. @Override
  16. public String marshal(Date date) throws Exception {
  17. return dateFormat.format(date);
  18. }
  19.  
  20. }

3、测试xml转换为java对象(jaxb工具类和前面一样)

  1. public class XMLTest {
  2. public static void main(String[] args) {
  3. try {
  4. BSPResponse response = JaxbXmlUtil.convertToJavaBean("<Response service='RouteService'><Head>OK</Head><Body><RouteResponse mailno='444003077899'><Route accept_time='2015-01-04 10:11:26' accept_address='深圳' remark='已收件' opcode='50'/><Route accept_time='2015-01-05 17:41:50' remark='此件签单返还的单号为 123638813181' opcode='922'/></RouteResponse></Body></Response>", BSPResponse.class);
  5. System.out.println("head:" + response.getHead());
  6. System.out.println("service:" + response.getService());
  7. System.out.println("error:" + response.getError());
  8. System.out.println("osrBody:" + response.getBody().getOrderResponse());
  9. System.out.println("rsrBody:" + response.getBody().getRouteResponse());
  10. System.out.println("RouteResponse/route:" + response.getBody().getRouteResponse().getRouteResponseRouteList());
  11. Date d1 = response.getBody().getRouteResponse().getRouteResponseRouteList().get(0).getAcceptTime();
  12. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  13. String str1 = sdf.format(d1);
  14. System.out.println(str1);
  15. Date d2 = response.getBody().getRouteResponse().getRouteResponseRouteList().get(1).getAcceptTime();
  16. String str2 = sdf.format(d2);
  17. System.out.println(str2);
  18.  
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22.  
  23. }
  24. }

后续用到更复杂jaxb操作的再来补上....

JAXB 专题二(BSP接口实战)的更多相关文章

  1. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  2. 性能测试专题:Locust工具实战之“蝗虫”降世

    阅读全文需5分钟. 1. 前言 在上一篇文章中,我们已经为大家介绍了什么是Locust,具体可参照:性能专题:Locust工具实战之开篇哲学三问,简单来说,Locust 是基于 Python 语言下的 ...

  3. Postman系列三:Postman中post接口实战(上传文件、json请求)

    一:接口测试过程中GET请求与POST请求的主要区别 从开发角度我们看get与post的主要区别是:1.Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据:2.Get安全性比Post低 ...

  4. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(三)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(四)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)

    系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...

  7. 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开

    [kuangbin带你飞]专题二 搜索进阶 之 A-Eight 这是一道经典的八数码问题.首先,简单介绍一下八数码问题: 八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的 ...

  8. 「kuangbin带你飞」专题二十 斜率DP

    layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathj ...

  9. 「kuangbin带你飞」专题二十二 区间DP

    layout: post title: 「kuangbin带你飞」专题二十二 区间DP author: "luowentaoaa" catalog: true tags: - ku ...

随机推荐

  1. 【JAVA】IOS内购二次验证及掉单问题解决

    这个估计是我踩过的最大的坑,当时做微信支付的时候也没这么坑爹,当然他俩也半斤八两... 苹果官方明确表示:验证支付时,可能会有一定的延迟.第一次处理的时间就专注的解决这个问题了,忽略了掉单的问题(稍后 ...

  2. Excel 读写操作

    读 import xlrd from xlrd.book import Book from xlrd.sheet import Sheet from xlrd.sheet import Cell wo ...

  3. AAC解码算法原理详解

  4. get传输时,会将加号+ 转换为空格

    解决办法: 前端: 替换加号为 ‘%2B’, 后端: 直接接收即可.

  5. pod上传私有spec文件库

    一.验证 function podlint() { pod lib lint $1.podspec --use-libraries --allow-warnings --verbose --sourc ...

  6. 重温CLR(八 ) 泛型

    熟悉面向对象编程的开发人员都深谙面向对象的好处,其中一个好处是代码重用,它极大提高了开发效率.也就是说,可以派生出一个类,让他继承基类的所有能力.派生类只需要重写虚方法,或添加一些新方法,就可定制派生 ...

  7. SQLserver2008使用表达式递归查询

    --由父项递归下级 with cte(id,parentid,text) as ( --父项 select id,parentid,text from treeview where parentid ...

  8. 8 函数类型——《Swift3.0从入门到出家

    Swift语言中每一个函数都有它特定的数据类型,称其为函数类型 函数类型和基本数据类型一样,可以定义变量或者常量,可以定义函数形参,也可以做为函数的返回值类型 函数类型的格式为:参数列表的数据类型—& ...

  9. mysql中OPTIMIZE TABLE的作用及使用

    来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...

  10. 为IIS Host ASP.NET Web Api添加Owin Middleware

    将OWIN App部署在IIS上 要想将Owin App部署在IIS上,只添加Package:Microsoft.OWIN.Host.SystemWeb包即可.它提供了所有Owin配置,Middlew ...