zoukankan      html  css  js  c++  java
  • 关于java后台如何接收xml格式的数据

    业务场景:用户发送下单请求,格式为xml格式,服务器接收数据完成下单,并返回结果给客户。

     请求格式:

    <request>
       <head>
         <sign></sign>
         <time></time>
         <msg></msg>
      </head>
      <body>
        <productId></productId>
        <count></count>
        <price></price>
        <user>
           <userId></userId>
           <name></name>
           <mobil></mobil>
           <email></email>
        </user>
        <extendInfos>
           <extendInfo>
              <city></city>
              <province></province>
              <district></district>
              <address></address>
           </extendInfo>
        </extendInfos>
      </body>
    </request>

    这段请求报文是xml格式的,在后台我们可以使用 javax.xml.bind.annotation 这个包格式化数据。

    我们可以在做数据对应的dto是用@XmlElement注释标注对应节点

    比如:

    import java.io.Serializable;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    import org.apache.commons.lang.builder.ToStringBuilder;
    import org.apache.commons.lang.builder.ToStringStyle;
    
    import com.juqitech.adapter.dto.ChannelDTO;
    
    @XmlRootElement(name = "request")
    @XmlAccessorType(XmlAccessType.NONE)
    public class RequestDTO implements Serializable {
    
        private static final long serialVersionUID = -1;
    
        @XmlElement
        private RequestHeaderDTO head;
        
        @XmlElement
        private RequestBodyDTO body;
    
        public RequestHeaderDTO getHead() {
            return head;
        }
    
        public void setHead(RequestHeaderDTO head) {
            this.head = head;
        }
    
        public RequestBodyDTO getBody() {
            return body;
        }
    
        public void setBody(RequestBodyDTO body) {
            this.body = body;
        }
    
    }
    @XmlRootElement(name = "request")可以定义在类上,代表根节点
    @XmlAccessorType(XmlAccessType.FIELD)
    表示使用这个类中的 private 非静态字段作为 XML 的序列化的属性或者元素。这里还可以选择属性,也就是使用 set/get 方法来序列化属性或者元素。

    关键在于在请求中有个extendInfos的array数组,一般我们都会用list来表示,所以在RequestBodyDTO中可以这么写:

    import java.io.Serializable;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlRootElement;
    
    import org.apache.commons.lang.builder.ToStringBuilder;
    import org.apache.commons.lang.builder.ToStringStyle;
    
    import com.juqitech.adapter.dto.ChannelDTO;
    
    @XmlRootElement(name = "body")
    @XmlAccessorType(XmlAccessType.NONE)
    public class RequestBodyDTO implements Serializable {
    
        private static final long serialVersionUID = -1;
    
        //....前面的属性省略
    
    
        @XmlElementWrapper(name="extendInfos") 
        @XmlElement(name="extendInfo") 
        private List<extendInfo> extendInfos;
        
         //。。其他的省略
    
    }
    @XmlRootElement(name
    = "extendInfo") @XmlAccessorType(XmlAccessType.NONE) public class extendInfo{ @XmlElement private String city; @XmlElement private String province; @XmlElement private String district; //省略 }
    @XmlElementWrapper 这个注释用来在外面在包一层,用于处理list集合
     
    
    
  • 相关阅读:
    希望多年以后的自己不再如此迷茫
    【转载】撒旦(Satan 4.2)勒索病毒最新变种加解密分析
    java单例模式
    关于double/float 两种基本类型精度丢失的总结
    关于ecplise中一些很实用的技巧
    安装SQL Server和卸载SQL Server步骤
    我进入部门的第一周
    mysql数据库在Linux和windows下免安装实现以及框架开发碰到的问题
    jenkins发布docker到mesos
    u盘作为git仓库,完成不同地方的代码同步
  • 原文地址:https://www.cnblogs.com/wangzun/p/7356463.html
Copyright © 2011-2022 走看看