SoapUI测试带@RequestBody注解的Rest POST接口报错求助
异常触发原因
- Spring MVC 中 @RequestBody 注解在单个请求方法中仅允许声明1次:HTTP请求的请求体是只能读取一次的数据流,Spring完成第一个@RequestBody参数的绑定后,请求体流就已经被消费完毕,第二个@RequestBody参数无法再读取到内容,因此抛出「请求体缺失」异常。
- 你的接口代码还存在逻辑错误:代码中调用了
requestbody.get("test"),但你并没有声明名为requestbody的参数,即使解决了多@RequestBody的问题,运行时也会抛出变量未定义的错误。
解决方案
下面列三种常用方案,按需选择:
- 方案1:定义DTO实体类接收整个JSON(推荐,参数校验、后续扩展更方便)
第一步定义接收实体:
第二步修改接口方法:// 自定义DTO类 public class PostDataReq { private String test; private String data; // 补充getter、setter方法 public String getTest() { return test; } public void setTest(String test) { this.test = test; } public String getData() { return data; } public void setData(String data) { this.data = data; } }@RequestMapping(value="/postdata", method= RequestMethod.POST, consumes="application/json") public String postdata(@RequestBody PostDataReq req) { logger.info("password reset Request " + req.getTest()); logger.info("password reset Request " + req.getData()); return "Hello"; } - 方案2:用Map类型直接接收整个JSON(无需额外定义类,适合快速测试场景)
修改接口方法如下即可:@RequestMapping(value="/postdata", method= RequestMethod.POST, consumes="application/json") public String postdata(@RequestBody Map<String, String> reqMap) { logger.info("password reset Request " + reqMap.get("test")); logger.info("password reset Request " + reqMap.get("data")); return "Hello"; } - 方案3:拆分参数位置(不推荐,不符合JSON传参的常规设计)
若一定要保留多个参数,可把非请求体参数改为@RequestParam从URL参数中获取,或改为@PathVariable从路径中获取,对应调整SoapUI的传参方式即可。
额外注意:SoapUI发送请求时,需要把请求头的
Content-Type设置为application/json,和接口的consumes配置匹配,避免出现内容类型不匹配的异常。
内容的提问来源于stack exchange,提问作者Uma
相关产品推荐
相关产品推荐

