@RequestBody注解失效?从前端传来的数据到底需不需要@RequestBody注解?前端传输数据解析的问题?

@RequestBody注解失效?从前端传来的数据到底需不需要@RequestBody注解?

又是在日常的从Mybatis升级Mybatis-Plus的过程中,我又发现了问题:怎么从前端传来的数据没有解析成我想要的实体类,可是其他的明明好用,怎么突然出现了这个问题?

之前正常运行的控制层:
@RequestMapping("/allAgency")
    public String getAgencyList(QueryInfo queryInfo) {

        QueryWrapper<Agency> wrapper = new QueryWrapper<>();
        wrapper
                .like("a_name", queryInfo.getQuery());

        Page<Agency> page = new Page<>(queryInfo.getPageNum(), queryInfo.getPageSize());

        agencyMapper.selectPage(page, wrapper);

        List<Agency> users = page.getRecords();

        HashMap<String, Object> res = new HashMap<>();
        res.put("number", agencyMapper.selectList(wrapper).size());
        res.put("data", users);

        return JSON.toJSONString(res);

    }

产生错误的控制层:
@RequestMapping("/allProductClass")
    public String getProductClassList(@RequestBody QueryInfo queryInfo) {

        QueryWrapper<ProductClass> wrapper = new QueryWrapper<>();
        wrapper
                .like("pc_name", queryInfo.getQuery());

        //获取最大列表数和当前编号

        Page<ProductClass> page = new Page<>(queryInfo.getPageNum(), queryInfo.getPageSize());
        productClassMapper.selectPage(page, wrapper);
        List<ProductClass> users = page.getRecords();


        HashMap<String, Object> res = new HashMap<>();
        res.put("number", productClassMapper.selectList(wrapper).size());
        res.put("data", users);

        return JSON.toJSONString(res);

    }

控制台错误信息(也是挺长一串):
 WARN 21136 --- [nio-9000-exec-7] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.neu.edu.cloudfactoryplus.controller.ProductClassController.getProductClassList(com.neu.edu.cloudfactoryplus.bean.QueryInfo)]

网页控制台错误信息:
Failed to load resource: the server responded with a status of 400 ()
createError.js?2d83:16 Uncaught (in promise) Error: Request failed with status code 400
    at createError (webpack-internal:///./node_modules/axios/lib/core/createError.js:16)
    at settle (webpack-internal:///./node_modules/axios/lib/core/settle.js:17)
    at XMLHttpRequest.handleLoad (webpack-internal:///./node_modules/axios/lib/adapters/xhr.js:62)
两张报错图片:

在这里插入图片描述

在这里插入图片描述


那么到底错在了那里呢?经过我仔细的比对,发现了区别:参数列表中的@RequestBody!!!!这个不是加上就行吗?这个还能出问题?于是我把注解删除。。。。md,竟然成功了。我最开始排除的就是这个问题。
我就上网搜搜资料,找到了原因!!!

首先是报错信息:异常org.springframework.http.converter.HttpMessageNotReadableException

原因是:在页面上传到后台的参数类型与页面的类型不匹配。

然后是@RequestBody注解:

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);而最常用的使用请求体传参的无疑是POST请求了,所以使用@RequestBody接收数据时,一般都用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

这里一定要注意,《一般都用POST方式进行提交》。是一般还是只能?我又去搜索了一下资料!!!

@RequestBody主要用来接收前端传递给后端的json字符串中的数据的(请求体中的数据的);GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,而是用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。

什么是请求体呢?对不起了,我的计算机网络老师,知识都还给您了。。。。。

在这里插入图片描述


综上所述,要是使用@RequestBody注解的话,你的前端发送数据的方式就一定是Post,不能是Get。那我把@RequestBody去了怎么还可以正常运行呢?因为可爱的Spring自动智能的把我们的数据封装好了。。。(他竟然也可以,以后我不用@RequestBody了,竟然还给我报错)

光总结不行,还要去亲自验证一下是不是这样的!!!
运行正确的前端(get+无注解):
async getUserList() {
      const {data:res} = await this.$http.get("allUserRole",{params:this.queryInfo});
      this.userList=res.data;
      this.total=res.number;
    },
运行错误的前端(get+注解):
async getUserList() {

      const {data:res} = await this.$http.get("allProductClass",{params:this.queryInfo});
      this.userList=res.data;
      this.total=res.number;

      console.log("run");

    },

看来和网上说的一样,bug的出处也是被我找到了。其实最开始我自己瞎试的时候,删掉就已经成功了,但是自己学习不能只是成功,还要弄明白之前对了,为什么现在错了,有果必有因!为什么会出现错误,出现错误的原因是什么?当你都找到之后,还是有一丢丢成就感的!
成功的网页控制台:

在这里插入图片描述

成功显示的界面:

在这里插入图片描述

看到这里了,不点个赞再走(o—o)
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值