spring boot 介面 XML 接受和請求
阿新 • • 發佈:2018-12-18
測試的xml 原檔案:
<?xml version="1.0" encoding="utf-8"?> <xml> <head> <app_key>mdDve0aYHGvSNZlcke0QyA3kSZihXYdi</app_key> <time_stamp>20181106175812</time_stamp> <nonce_str>go9d1cjk644d7wuaa7v8g7wkijh00ie2</nonce_str> <sign>f716b0f0463f3df7356c473da37ff449</sign> </head> <body> <records> <record> <mission_num>verify_code20181106175707</mission_num> <dest_id>13272661024</dest_id> <send_status>FAIL</send_status> <receive_status>FAIL</receive_status> <receive_real_status>DB:9141</receive_real_status> <batch_num>shilukj0120181106175707</batch_num> <stat_time>2018-11-06 17:58:12</stat_time> </record> </records> </body> </xml>
spring boot 介面處理:
import java.util.List; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import com.xianjinxia.sms.pojo.output.BaseResponse; import com.xianjinxia.sms.service.impl.cloudfeng.sms.util.CloudFengUtil; import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.Body; import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.Record; import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.Records; import com.xianjinxia.sms.service.impl.cloudfeng.sms.xmlutil.XmlRemoteDto; import lombok.extern.slf4j.Slf4j; @Slf4j public class AA { /** * yunfeng POST 方式 用的是@RequestBody 註解 引數型別是String * @param req * @return */ @PostMapping("/rpt/smsStatusPullYunFeng") public BaseResponse<Void> smsStatusPullYunFeng(@RequestBody String msgreport) { BaseResponse<Void> resp = new BaseResponse(); log.info("yunfeng,回撥引數為={}",msgreport); XmlRemoteDto dto = (XmlRemoteDto) CloudFengUtil.convertXmlStrToObject(XmlRemoteDto.class, msgreport); Body body = dto.getBody(); Records records = body.getRecords(); List<Record> rec = records.getRecord(); Record record = rec.get(0); int count = 0; // ............... return resp; } }
xml 格式的字串 轉成 Java 物件的 工具類:
import java.io.StringReader; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; public class CloudFengUtil { /** * 解析內容 * * @param clazz * @param xmlStr * @return */ public static Object convertXmlStrToObject(Class clazz, String xmlStr) { Object xmlObject = null; try { JAXBContext context = JAXBContext.newInstance(clazz); // 進行將Xml轉成物件的核心介面 Unmarshaller unmarshaller = context.createUnmarshaller(); StringReader sr = new StringReader(xmlStr); xmlObject = unmarshaller.unmarshal(sr); } catch (JAXBException e) { e.printStackTrace(); } return xmlObject; } }
XML 需要轉換的幾個JavaBean:
XmlRemoteDto:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
最重要的就是 不要 XmlType 和 XmlRootElement 註解不要弄混了
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"head","body"})
@XmlRootElement(name="xml")
public class XmlRemoteDto {
private Head head;
private Body body;
// setter getter 方法
// toString 方法
@Override
public String toString() {
return "XmlRemoteDto [head=" + head + ", body=" + body + "]";
}
}
Head:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="head") // 當前節點名稱
public class Head {
@XmlElement(name = "app_key") // 子節點名稱
private String appKey;
@XmlElement(name = "time_stamp") // 子節點名稱
private String timeStamp;
@XmlElement(name = "nonce_str") // 子節點名稱
private String nonceStr;
@XmlElement(name = "sign") // 子節點名稱
private String sign;
// setter getter 方法
// toString 方法
@Override
public String toString() {
return "Head [appKey=" + appKey + ", timeStamp=" + timeStamp + ", nonceStr=" + nonceStr + ", sign=" + sign
+ "]";
}
}
Body :
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 javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"records"}) // 子節點
@XmlRootElement(name="body") // 當前節點
public class Body {
@XmlElement(name = "records") // 子節點名稱
private Records records;
// setter getter 方法
// toString 方法
@Override
public String toString() {
return "Body [records=" + records + "]";
}
}
Records:
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"record"})
@XmlRootElement(name="records")
public class Records {
private List<Record> record;
// setter getter 方法
//toString方法
@Override
public String toString() {
return "Records [record=" + record + "]";
}
}
Record :
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="record")
public class Record {
@XmlElement(name = "mission_num")
private String missionNum;
@XmlElement(name = "dest_id")
private String destId;
@XmlElement(name = "send_status")
private String sendStatus;
@XmlElement(name = "receive_status")
private String receiveStatus;
@XmlElement(name = "batch_num")
private String batchNum;
@XmlElement(name = "stat_time")
private String statTime;
// setter getter 方法
//toString方法
@Override
public String toString() {
return "Record [missionNum=" + missionNum + ", destId=" + destId + ", sendStatus=" + sendStatus
+ ", receiveStatus=" + receiveStatus + ", batchNum=" + batchNum + ", statTime=" + statTime + "]";
}
}