@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");
},