業務場景:用戶發送下單請求,格式為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集合