You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SoapUI测试带@RequestBody注解的Rest POST接口报错求助

异常触发原因
  1. Spring MVC 中 @RequestBody 注解在单个请求方法中仅允许声明1次:HTTP请求的请求体是只能读取一次的数据流,Spring完成第一个@RequestBody参数的绑定后,请求体流就已经被消费完毕,第二个@RequestBody参数无法再读取到内容,因此抛出「请求体缺失」异常。
  2. 你的接口代码还存在逻辑错误:代码中调用了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 17:24:02