1.请求参数格式必须是正确的JSON。
2.在入参中使用注解@RequestBody,用于接收JSON参数,使其自动转对象
3.关于lombok在此产生的一点小坑,@Builder对@RequestBody的影响
4.标识请求参数的格式为JSON--->> @PostMapping(value="/Test",produces = "application/json;charset=UTF-8")
1.后端代码
@RestController
@RequestMapping("/Test")
public class TestController {
@PostMapping(value="/Test",produces = "application/json;charset=UTF-8")
public ContentSet Test(@RequestBody CommandInfo commandInfo){
System.out.println(commandInfo);
return null;
}
}
2.实体类代码
@Getter
@Setter
@ToString
public class CommandInfo implements Serializable {
private int XXX;
private int ZZZ;
private Map<String,String> ,mapPamater;
}
3.PostMan模拟请求
方法二:
@RequestMapping(value = "/addStockInAndDetails", method = RequestMethod.POST, produces = "text/html;charset=UTF-8")
@ResponseBody
@ApiOperation(value = "add in stock and details", notes = "商品入库")
@ApiResponse(response= String.class, code = 200, message = "接口返回对象参数")
public String addStockInAndDetails(@RequestBody StockInDetails details) {
System.out.println("-----------------"+details);
try {
if(details==null) {
return "parameterError";
}
StockIn stockIn = new StockIn(details.getInCode(), details.getSupplyId(), details.getInStatus(), details.getInTime());
stockInService.insert(stockIn);
if(stockIn.getInId()>0) {
for (StockInDetail detail : details.getDetails()) {
detail.setInId(stockIn.getInId());
stockInDetailService.insert(detail);
}
}
return "success";
} catch (Exception e) {
e.printStackTrace();
return "fail";
}
}
对于第二种方法,前端ajax使用情况:
//添加商品
$("#btnSave").click(function(){
var addInCode = $("#addInCode").val();
var AddSupply = $("#AddSupply").val();
var date = new Date();
var createTime = dateFormat("YYYY-mm-dd HH:MM:SS", date);
if(addInCode == ""){
alert("入库单号不能为空");
return ;
}
var details = $("#stockInDetailTab").bootstrapTable('getData');
var paramData = {
"details": details,
"inCode": addInCode,
"inStatus": "0",
"inTime": createTime,
"supplyId": AddSupply
};
var addUrl = baseUrl + "/Inventory/repair/StockIn/addStockInAndDetails";
$.ajax({
type: 'POST',
url: addUrl,
dataType: 'json',
cache: false,
headers : {
'Content-Type' : 'application/json;charset=utf-8'
},
data: JSON.stringify(paramData),
success: function (data) {
if(data == "success"){
$('#addModal').modal('hide');
InitTable(url);
}else{
alert("添加失败");
}
},
error: function(er){
if(er.responseText == "success"){
$('#addModal').modal('hide');
InitTable(url);
}else{
alert("添加失败");
}
}
});
});
原因:
@RequestParam 底层是通过request.getParameter方式获得参数的,也就是说,@RequestParam 和request.getParameter是同一回事。
因为使用request.getParameter()方式获取参数,可以处理get 方式中queryString的值,也可以处理post方式中 body data的值,所以,@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。
@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST。
@RequestBody接受的是一个json对象的字符串,而不是Json对象,在ajax请求时往往都是Json对象,用JSON.stringify(data)的方式就能将对象变成json字符串。
@RequestBody接收的是一个字符串,返回的参数可以是一个Map对象。