zoukankan      html  css  js  c++  java
  • JAXB 专题二(BSP接口实战)

    BSP下单接口

    1、xml格式如下

    <?xml version="1.0" encoding="utf-8"?>
    
    <Request service="OrderService" lang="zh-CN"> 
      <Head>BSPdevelop</Head>  
      <Body> 
        <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"> <Cargo name="旧手机"/> </Order> </Body> </Request>

    2、构造的xml实体类如下

    import java.util.List;
    
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlElementWrapper;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlSeeAlso;
    import javax.xml.bind.annotation.XmlType;
    
    /**
     * @ClassName BSPRequest
     * @Description bsp接口请求元素
     * @author 
     * @Date 2018年4月20日 下午4:46:04
     * @version 1.0.0
     * @param <T>
     */
    @XmlRootElement(name="Request")
    //@XmlSeeAlso({OrderServiceBody.class}) //工具类中实例化时如果没有加入泛型对象,也可以在这里利用此注解加入可能用到的所有泛型对象
    @XmlType(propOrder = { "head", "body"}) //指明生成xml的标签顺序,写属性名
    public class BSPRequest<T> {
        
        private String service;             //请求接口服务名
        private String lang;                //响应报文语言,中文简体:zh-CN
        private String head;                //接入编码:BSPdevelop
        private T body;     //body:请求数据XML
        
        @XmlAttribute(name="service")
        public String getService() {
            return service;
        }
        
        public void setService(String service) {
            this.service = service;
        }
        
        @XmlAttribute(name="lang")
        public String getLang() {
            return lang;
        }
        
        public void setLang(String lang) {
            this.lang = lang;
        }
        
        @XmlElement(name="Head")
        public String getHead() {
            return head;
        }
        
        public void setHead(String head) {
            this.head = head;
        }
    
        @XmlElement(name="Body")
        public T getBody() {
            return body;
        }
        
        public void setBody(T body) {
            this.body = body;
        }
        
    }
    import javax.xml.bind.annotation.XmlElement;
    
    
    /**
     * @ClassName OrderServiceBody
     * @Description BSP下单接口请求体
     * @author 
     * @Date 2018年4月20日 下午5:18:28
     * @version 1.0.0
     */
    public class OrderServiceRequestBody {
        private BSPOrder order;//order:下单接口请求数据
    
        @XmlElement(name="Order")
        public BSPOrder getOrder() {
            return order;
        }
    
        public void setOrder(BSPOrder order) {
            this.order = order;
        } 
        
    }
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    
    /**
     * @ClassName BSPOrder
     * @Description 下单(含筛选)接口 Order元素
     * @author 
     * @Date 2018年4月20日 下午4:45:56
     * @version 1.0.0
     */
    public class BSPOrder {
        private String orderId;         //客户订单号
        private int isGenBillNo;        //1:要求接口返回顺丰运单号
        private String jCompany;        //寄件方公司名称
        private String jContact;        //寄件方联系人
        private String jTel;            //寄件方联系电话
        private String jProvince;      //寄件方省
        private String jCity;          //寄件方城市
        private String jCounty;        //寄件方区/县
        private String jAddress;        //寄件方详细地址
        private String dCompany;        //到件方公司名称
        private String dContact;        //到件方联系人
        private String dTel;            //到件方联系电话
        private String dProvince;       //到件方所在省份
        private String dCity;           //到件方所在城市
        private String dCounty;         //到件方所在县/区
        private String dAddress;        //到件方详细地址
        private String custid;          //顺丰月结卡号
        private int payMethod;          //付款方式;1:寄方付   2:收方付   3:第三方付
        private String remark;          //备注
    //    private int isGenEletricPic;    //是否生成电子运单图片,1为是
        private OrderCargo cargo;            //order下的cargo元素
        private int isDocall;          //是否要求通过是否手持终端;通知顺丰收派员收件;1:要求  ;其它为不要求
        private int expressType;        //顺丰默认是1:顺丰特快,2:顺丰特惠;
        
        @XmlAttribute(name="orderid")
        public String getOrderId() {
            return orderId;
        }
        
        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }
        
        @XmlAttribute(name="is_gen_bill_no")
        public int getIsGenBillNo() {
            return isGenBillNo;
        }
        
        public void setIsGenBillNo(int isGenBillNo) {
            this.isGenBillNo = isGenBillNo;
        }
        
        @XmlAttribute(name="j_company")
        public String getjCompany() {
            return jCompany;
        }
        
        public void setjCompany(String jCompany) {
            this.jCompany = jCompany;
        }
        
        @XmlAttribute(name="j_contact")
        public String getjContact() {
            return jContact;
        }
        
        public void setjContact(String jContact) {
            this.jContact = jContact;
        }
        
        @XmlAttribute(name="j_tel")
        public String getjTel() {
            return jTel;
        }
        
        public void setjTel(String jTel) {
            this.jTel = jTel;
        }
        
        @XmlAttribute(name="j_address")
        public String getjAddress() {
            return jAddress;
        }
        
        public void setjAddress(String jAddress) {
            this.jAddress = jAddress;
        }
        
        @XmlAttribute(name="d_company")
        public String getdCompany() {
            return dCompany;
        }
        
        public void setdCompany(String dCompany) {
            this.dCompany = dCompany;
        }
        
        @XmlAttribute(name="d_contact")
        public String getdContact() {
            return dContact;
        }
        
        public void setdContact(String dContact) {
            this.dContact = dContact;
        }
        
        @XmlAttribute(name="d_tel")
        public String getdTel() {
            return dTel;
        }
        
        public void setdTel(String dTel) {
            this.dTel = dTel;
        }
        
        @XmlAttribute(name="d_province")
        public String getdProvince() {
            return dProvince;
        }
        
        public void setdProvince(String dProvince) {
            this.dProvince = dProvince;
        }
        
        @XmlAttribute(name="d_city")
        public String getdCity() {
            return dCity;
        }
        
        public void setdCity(String dCity) {
            this.dCity = dCity;
        }
        
        @XmlAttribute(name="d_county")
        public String getdCounty() {
            return dCounty;
        }
        
        public void setdCounty(String dCounty) {
            this.dCounty = dCounty;
        }
        
        @XmlAttribute(name="d_address")
        public String getdAddress() {
            return dAddress;
        }
        
        public void setdAddress(String dAddress) {
            this.dAddress = dAddress;
        }
        
        @XmlAttribute(name="custid")
        public String getCustid() {
            return custid;
        }
        
        public void setCustid(String custid) {
            this.custid = custid;
        }
        
        @XmlAttribute(name="pay_method")
        public int getPayMethod() {
            return payMethod;
        }
        
        public void setPayMethod(int payMethod) {
            this.payMethod = payMethod;
        }
        
        @XmlAttribute(name="remark")
        public String getRemark() {
            return remark;
        }
        
        public void setRemark(String remark) {
            this.remark = remark;
        }
        
        @XmlElement(name="Cargo",required = true)
        public OrderCargo getCargo() {
            return cargo;
        }
        
        public void setCargo(OrderCargo cargo) {
            this.cargo = cargo;
        }
    
        @XmlAttribute(name="j_province")
        public String getjProvince() {
            return jProvince;
        }
    
        
        public void setjProvince(String jProvince) {
            this.jProvince = jProvince;
        }
    
        @XmlAttribute(name="j_city")
        public String getjCity() {
            return jCity;
        }
    
        
        public void setjCity(String jCity) {
            this.jCity = jCity;
        }
    
        @XmlAttribute(name="j_county")
        public String getjCounty() {
            return jCounty;
        }
    
        
        public void setjCounty(String jCounty) {
            this.jCounty = jCounty;
        }
    
        @XmlAttribute(name="is_docall")
        public int getIsDocall() {
            return isDocall;
        }
    
        public void setIsDocall(int isDocall) {
            this.isDocall = isDocall;
        }
    
        @XmlAttribute(name="express_type")
        public int getExpressType() {
            return expressType;
        }
        
        public void setExpressType(int expressType) {
            this.expressType = expressType;
        }
    
       
    }
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    
    
    /**
     * @ClassName OrderCargo
     * @Description 元素<请求>Order/Cargo
     * @author 
     * @Date 2018年4月20日 下午4:46:45
     * @version 1.0.0
     */
    public class OrderCargo {
        private String name;            //货物名称:旧手机
    
        
        @XmlAttribute(name="name")
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    3、jaxb的工具类

    import java.io.StringReader;
    import java.io.StringWriter;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    import javax.xml.bind.JAXBContext;
    import javax.xml.bind.Marshaller;
    import javax.xml.bind.Unmarshaller;
    /**
     * @ClassName JaxbXmlUtil
     * @Description Jaxb工具类 xml和java类相互转换
     * @author 
     * @Date 2018年4月20日 下午4:45:34
     * @version 1.0.0
     */
    public class JaxbXmlUtil {
    
        public static final String DEFAULT_ENCODING = "UTF-8";
    
        /**
         * pojo转换成xml 默认编码UTF-8
         *
         * @param obj 待转化的对象
         * @return xml格式字符串
         * @throws Exception JAXBException
         */
        public static String convertToXml(Object obj) throws Exception {
            return convertToXml(obj, DEFAULT_ENCODING);
        }
    
        /**
         * pojo转换成xml
         *
         * @param obj 待转化的对象
         * @param encoding 编码
         * @return xml格式字符串
         * @throws Exception JAXBException
         */
        public static String convertToXml(Object obj, String encoding) throws Exception {
            String result = null;
            JAXBContext context = JAXBContext.newInstance(obj.getClass(), OrderServiceRequestBody.class, RouteServiceRequestBody.class);//指定obj中可以传入的泛型对象,这里BSPRequest<T>使用了泛型,所以必须加入具体可能用到的泛型对象
    //        JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller marshaller = context.createMarshaller();
            // 指定是否使用换行和缩排对已编组 XML 数据进行格式化的属性名称。
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
    
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            result = writer.toString();
    
            return result;
        }
    
        /**
         * xml转换成JavaBean
         *
         * @param xml xml格式字符串
         * @param t 待转化的对象
         * @return 转化后的对象
         * @throws Exception JAXBException
         */
        @SuppressWarnings("unchecked")
        public static <T> T convertToJavaBean(String xml, Class<T> t) throws Exception {
            T obj = null;
            JAXBContext context = JAXBContext.newInstance(t);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            obj = (T) unmarshaller.unmarshal(new StringReader(xml));
            return obj;
        }
        
        /**
         * @Description <body> 标签中其余字符去掉 (TODO这里用一句话描述这个方法的作用)
         * @param str
         * @return
         * @throws Exception
         */
        public static String StringFilter(String str)throws Exception {
            //将<Body xsi:type="orderServiceBody" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">替换为<Body>
            String regEx = "<Body(.|\s)*?>";
            Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(str);
            return matcher.replaceAll("<Body>").trim();
        }
    }

    测试下单接口如下

    public class XMLTest {
        public static void main(String[] args) {
            try {
                BSPRequest<OrderServiceRequestBody> orderService = new BSPRequest<OrderServiceRequestBody>();
                orderService.setHead("BSPdevelop");
                orderService.setLang("zh-CN");
                orderService.setService("OrderService");
                
                BSPOrder order = new BSPOrder();
                order.setOrderId("15648154");
                order.setIsGenBillNo(1);
                order.setjProvince("重庆");
                order.setjCity("重庆");
                order.setjCounty("璧山区");
                order.setjAddress("广东省深圳市宝安区布心一村");
                order.setdCompany("公司1");
                order.setdContact("联系人");
                order.setdTel("电话");
                order.setdAddress("地址");
                order.setPayMethod(2);
                
                order.setjTel("电话");
                 
                OrderCargo cargo = new OrderCargo();
                cargo.setName("旧手机");
                order.setCargo(cargo);
                
                OrderServiceRequestBody body = new OrderServiceRequestBody();
                body.setOrder(order);
                orderService.setBody(body);
                
                String xml = JaxbXmlUtil.convertToXml(orderService);
                System.out.println(xml);
                String xmlRequest = JaxbXmlUtil.StringFilter(xml).replace("standalone="yes"", ""); //jaxb默认会生成standalone字符串,如果不想要可以这样替换为空串
                System.out.println(xmlRequest);
    
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
    }

    BSP路由查询接口

    1、xml格式如下

    <Request service='RouteService' lang='zh-CN'>
    <Head>BSPdevelop</Head>
    <Body>
    <RouteRequest
    tracking_type='1'
    method_type='1'
    tracking_number='444003077898'/>
    </Body>
    </Request>

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

    import javax.xml.bind.annotation.XmlElement;
    /**
     * @ClassName RouteServiceBody
     * @Description 路由查询接口请求体
     * @author 
     * @Date 2018年4月24日 上午10:46:32
     * @version 1.0.0
     */
    public class RouteServiceRequestBody {
        private BSPRouteRequest routeRequest;       //RouteRequest元素
    
        @XmlElement(name="RouteRequest")
        public BSPRouteRequest getRouteRequest() {
            return routeRequest;
        }
        
        public void setRouteRequest(BSPRouteRequest routeRequest) {
            this.routeRequest = routeRequest;
        }
        
        
    }
    import javax.xml.bind.annotation.XmlAttribute;
    
    /**
     * @ClassName BSPRouteRequest
     * @Description 路由查询接口RouteRequest元素
     * @author 
     * @Date 2018年4月24日 上午10:48:57
     * @version 1.0.0
     */
    public class BSPRouteRequest {
        private int trackingType;        //查询号类别,1:顺丰运单号查询;2:客户订单号查询
        private String trackingNumber;      //查询号
        
        @XmlAttribute(name="tracking_type")
        public int getTrackingType() {
            return trackingType;
        }
        
        public void setTrackingType(int trackingType) {
            this.trackingType = trackingType;
        }
        
        @XmlAttribute(name="tracking_number")
        public String getTrackingNumber() {
            return trackingNumber;
        }
        
        public void setTrackingNumber(String trackingNumber) {
            this.trackingNumber = trackingNumber;
        }
        
        
    }

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

    public class XMLTest {
        public static void main(String[] args) {
            try {
                BSPRequest<RouteServiceRequestBody> routeService = new BSPRequest<RouteServiceRequestBody>();
                routeService.setHead("BSPdevelop");
                routeService.setLang("zh-CN");
                routeService.setService("RouteService");
                RouteServiceRequestBody body = new RouteServiceRequestBody();
                BSPRouteRequest routeRequest = new BSPRouteRequest();
                routeRequest.setTrackingType(2);
                routeRequest.setTrackingNumber("哈哈");
                body.setRouteRequest(routeRequest);
                routeService.setBody(body);
                
                String xml = JaxbXmlUtil.convertToXml(routeService);
                System.out.println(xml);
                String xmlRequest = JaxbXmlUtil.StringFilter(xml).replace("standalone="yes"", "");
                System.out.println(xmlRequest);
               
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
    }

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

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

    1、xml格式如下

    <?xml version="1.0" encoding="utf-8"?>
    
    <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>

    2、构造的xml实体类如下

    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    import javax.xml.bind.annotation.XmlSeeAlso;
    import javax.xml.bind.annotation.XmlType;
    
    /**
     * @ClassName BSPResponse
     * @Description bsp响应接口
     * @author 
     * @Date 2018年4月24日 上午11:19:14
     * @version 1.0.0
     */
    @XmlRootElement(name="Response")
    public class BSPResponse {
        private String service;     //响应接口服务名
        private String head;        //OK:交易成功,只返回Body元素;ERR:交易失败,只返回Error元素; Body元素和Error元素不能同时存在
        private BSPError error;     //失败时的error元素
        private BSPResponseBody body;   //响应体   
        
        @XmlAttribute(name="service")
        public String getService() {
            return service;
        }
        
        public void setService(String service) {
            this.service = service;
        }
        
        @XmlElement(name="Head")    //例如<Head>OK</Head>这样的用XmlElement注释,所以此注释是填充标签之间的内容;而XmlAttribute是填充开始标签中的属性值
        public String getHead() {
            return head;
        }
        
        public void setHead(String head) {
            this.head = head;
        }
        
        @XmlElement(name="ERROR")
        public BSPError getError() {
            return error;
        }
        
        public void setError(BSPError error) {
            this.error = error;
        }
    
        @XmlElement(name="Body")
        public BSPResponseBody getBody() {
            return body;
        }
        
        public void setBody(BSPResponseBody body) {
            this.body = body;
        }
    
        @Override
        public String toString() {
            return "BSPResponse [service=" + service + ", head=" + head + ", error=" + error + ", body=" + body + "]";
        }
        
    }
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlValue;
    
    
    /**
     * @ClassName BSPError
     * @Description 响应Error元素
     * @author 
     * @Date 2018年4月24日 上午11:43:46
     * @version 1.0.0
     */
    public class BSPError {
        private int code;       //错误代码
        private String message; //错误详细信息
        
        @XmlAttribute(name="code")
        public int getCode() {
            return code;
        }
        
        public void setCode(int code) {
            this.code = code;
        }
        
        @XmlValue   //<ERROR code="4001">系统发生数据错误或运行时异常</ERROR>像这样,既有属性值,又有标签内容怎么办呢?就用到XmlValue注释,此注释就是添加内容,不会增加子标签;
        public String getMessage() {
            return message;
        }
        
        public void setMessage(String message) {
            this.message = message;
        }
    
        @Override
        public String toString() {
            return "BSPError [code=" + code + ", message=" + message + "]";
        }
        
        
    }
    import javax.xml.bind.annotation.XmlElement;
    
    /**
     * @ClassName BSPResponseBody
     * @Description BSP响应体(这里用一句话描述这个类的作用)
     * @author 贺雄云
     * @Date 2018年4月25日 上午11:41:04
     * @version 1.0.0
     */
    public class BSPResponseBody {
        private BSPOrderResponse orderResponse; //下单接口响应体
        private BSPRouteResponse routeResponse; //路由查询接口响应体内容
        
        @XmlElement(name="OrderResponse")
        public BSPOrderResponse getOrderResponse() {
            return orderResponse;
        }
        
        public void setOrderResponse(BSPOrderResponse orderResponse) {
            this.orderResponse = orderResponse;
        }
        
        @XmlElement(name="RouteResponse")
        public BSPRouteResponse getRouteResponse() {
            return routeResponse;
        }
        
        public void setRouteResponse(BSPRouteResponse routeResponse) {
            this.routeResponse = routeResponse;
        }
    }

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

    import java.util.List;
    
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    
    
    /**
     * @ClassName BSPRouteResponse
     * @Description 路由查询接口响应元素RouteResponse
     * @author 
     * @Date 2018年4月25日 上午10:37:46
     * @version 1.0.0
     */
    public class BSPRouteResponse {
        private String mailNo;      //顺丰运单号
        private String orderId;     //客户订单号,按客户订单号查询时为必填。按顺丰运单号查询时为空。
        private List<RouteResponseRoute> routeResponseRouteList;  //子元素 RouteResponse/Route,多个
        
        @XmlAttribute(name="mailno")
        public String getMailNo() {
            return mailNo;
        }
        
        public void setMailNo(String mailNo) {
            this.mailNo = mailNo;
        }
        
        @XmlAttribute(name="orderid")
        public String getOrderId() {
            return orderId;
        }
        
        public void setOrderId(String orderId) {
            this.orderId = orderId;
        }
    
        @XmlElement(name="Route")
        public List<RouteResponseRoute> getRouteResponseRouteList() {
            return routeResponseRouteList;
        }
        
        public void setRouteResponseRouteList(List<RouteResponseRoute> routeResponseRouteList) {
            this.routeResponseRouteList = routeResponseRouteList;
        }
    
        @Override
        public String toString() {
            return "BSPRouteResponse [mailNo=" + mailNo + ", orderId=" + orderId + ", routeResponseRouteList="
                    + routeResponseRouteList + "]";
        }
        
    }
    import java.util.Date;
    
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
    
    
    /**
     * @ClassName RouteResponseRoute
     * @Description 路由查询接口 响应元素 RouteResponse/Route
     * @author 
     * @Date 2018年4月25日 上午10:50:27
     * @version 1.0.0
     */
    public class RouteResponseRoute implements Comparable<RouteResponseRoute> {
        private Date acceptTime;        //路由节点发生的时间,格式:YYYY-MM-DD HH24:MM:SS,示例:2012-7-30 09:30:00。
        private String acceptAddress;   //路由节点发生的地点
        private String remark;          //路由节点具体描述
        private String opcode;          //路由节点操作码
        
        @XmlAttribute(name="accept_time")
        @XmlJavaTypeAdapter(JaxbDateSerializer.class)  //日期格式的转换,定义了一个JaxbDateSerializer转换类,使用此注解就可以了
        public Date getAcceptTime() {
            return acceptTime;
        }
        
        public void setAcceptTime(Date acceptTime) {
            this.acceptTime = acceptTime;
        }
        
        @XmlAttribute(name="accept_address")
        public String getAcceptAddress() {
            return acceptAddress;
        }
        
        public void setAcceptAddress(String acceptAddress) {
            this.acceptAddress = acceptAddress;
        }
        
        @XmlAttribute(name="remark")
        public String getRemark() {
            return remark;
        }
        
        public void setRemark(String remark) {
            this.remark = remark;
        }
        
        @XmlAttribute(name="opcode")
        public String getOpcode() {
            return opcode;
        }
        
        public void setOpcode(String opcode) {
            this.opcode = opcode;
        }
    
        @Override
        public String toString() {
            return "RouteResponseRoute [acceptTime=" + acceptTime + ", acceptAddress=" + acceptAddress + ", remark="
                    + remark + ", opcode=" + opcode + "]";
        }
    
        @Override
        public int compareTo(RouteResponseRoute o) {
            long l = this.getAcceptTime().getTime() - o.getAcceptTime().getTime();
            if (l > 0) {
                return -1;
            }else if (l == 0) {
                return 0;
            }else {
                return 1;
            }
        }
        
    }
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import javax.xml.bind.annotation.adapters.XmlAdapter;
    
    //日期转化的类
    public class JaxbDateSerializer extends XmlAdapter<String, Date> {
    
        private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
           
        @Override
        public Date unmarshal(String date) throws Exception {
            return dateFormat.parse(date);  
        }
    
        @Override
        public String marshal(Date date) throws Exception {
            return dateFormat.format(date);  
        }
    
    }

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

    public class XMLTest {
        public static void main(String[] args) {
            try {
                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);
                System.out.println("head:" + response.getHead());
                System.out.println("service:" + response.getService());
                System.out.println("error:" + response.getError());
                System.out.println("osrBody:" + response.getBody().getOrderResponse());
                System.out.println("rsrBody:" + response.getBody().getRouteResponse());
                System.out.println("RouteResponse/route:" + response.getBody().getRouteResponse().getRouteResponseRouteList());
                Date d1 = response.getBody().getRouteResponse().getRouteResponseRouteList().get(0).getAcceptTime();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                String str1 = sdf.format(d1);
                System.out.println(str1);
                Date d2 = response.getBody().getRouteResponse().getRouteResponseRouteList().get(1).getAcceptTime();
                String str2 = sdf.format(d2);
                System.out.println(str2);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            
        }
    }

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

  • 相关阅读:
    【Java并发】并发笔记(一)
    【深入Java基础】排序算法(一)
    QDU-GZS and String
    牛客网36-A,B题解
    QDU-GZS与素数大法(素数筛法)
    csdn自动展开+去广告+净化剪切板+免登陆(如有侵权,立即删博)
    QDU第一届程序设计大赛——E到I题解法(非官方题解)
    Codeforces Round #529 -C- Powers Of Two(二进制拆分)
    CodeForces
    分配物资(模拟)
  • 原文地址:https://www.cnblogs.com/cainiao-Shun666/p/9179159.html
Copyright © 2011-2022 走看看