今天在写接收XML格式的controller方法时,遇到一些问题,在此记录下:
先放最终结果代码
1、前端代码
var xmlData = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Request><smsType>1</smsType><fromNum>测试测试</fromNum></Request>";
$.ajax("../../ReceiverRestSMS/receiverSMS.do",// 发送请求的URL字符串。
{
type : "POST", // 请求方式 POST或GET
contentType:"application/xml", // 发送信息至服务器时的内容编码类型
// 发送到服务器的数据。
data: xmlData,
async: true , // 默认设置下,所有请求均为异步请求。如果设置为false,则发送同步请求
});
2、后台代码:
@RequestMapping(value ="/receiverSMS",method=RequestMethod.POST,consumes="application/xml")
@ResponseBody
public Map<String,Object> receiverSMS(@RequestBody RestSMS restSms) {
HashMap<String,Object> result = new HashMap<String,Object>();
logger.info("回调参数:"+restSms.toString());
return result;
}
@XmlRootElement(name ="Request")
public class RestSMS {
private String smsType;
private String fromNum;
private String content;
private String status;
private String deliverCode;
public String getSmsType() {
return smsType;
}
public void setSmsType(String smsType) {
this.smsType = smsType;
}
public String getFromNum() {
return fromNum;
}
public void setFromNum(String fromNum) {
this.fromNum = fromNum;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDeliverCode() {
return deliverCode;
}
public void setDeliverCode(String deliverCode) {
this.deliverCode = deliverCode;
}
@Override
public String toString() {
return "[smsType="+smsType+",fromNum="+fromNum+",content="+content+",status="+status+",deliverCode="+deliverCode+"]";
}
}
问题1:请求状态码为415,即后台转换XML时出错,原因是实体类没加@XmlRootElement(name ="Request") ,该参数可以将实体类指定为xml根节点,即让根节点下的子节点转换为实体类对应属性,若不加name参数,则根节点名称必须为实体类名称。
问题2:SpringMVC抛出异常:Could not resolve view with name 'ReceiverRestSMS/receiverSMS' in servlet with name 'springmvc' 。原因是配置了<property name="contentType" value="text/html" />后,默认返回response的contentType格式为html,即直接跳转页面,因此要加上@ResponseBody,将数据写入response的body中
注意:controller方法接收参数格式为xml时,方法头部注解最好要加上consumes="application/xml"