关于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集合
 

posted @ 2017-08-14 10:33  Johnson_wang  阅读(14007)  评论(0编辑  收藏  举报