SpringBoot 传入JSON对象参数
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对象。