标题太长有木有?还不系那个给你把问题说清楚,免得进错博客,๑乛◡乛๑
昨天有同事在做前端Android的接口,前端传递过来的参数也竟然是自己编写方法处理,于是就把这篇文章写出来,其实想一想都能想通,SpringMVC这么牛逼的一个框架,会不考虑前台传递JSON到后台?怎么可能,如果你要做一个框架,是不是应该最先去满足最常用的需求呢?
情景:前台发送POST请求
解决方案:
一、自己编写方法解析,略过
二、通过实体类接收参数
- 代码实现
@RequestMapping(value = "/save.do") @ResponseBody public String save(@RequestBody Employee emp) { this.empService.insertObj(emp); return "success"; }
- 主要就是使用
@RequestBody
来把请求的请求体中的参数自动转化成实体属性
三、通过Map接收所有参数
- 代码实现
@RequestMapping(value = "/save.do") @ResponseBody public String save(@RequestBody Map<String, Object> params) { this.empService.insertObj(params); return "success"; }
- 还是使用
@RequestBody
来把请求的请求体中的参数自动转化到Map中
你以为就完成了吗?๑乛◡乛๑
如果你的答案是YES, 对不起你和我一样都是一个XX,服务端的内容没有问题,但是客户浏览器等是没有完的,请求端需要在请求头中设置Content-Type为application/json
才可以的,否则415错误就等着你哦。。。
又回来了~~~
补充一个问题
如果使用@RequestBody
注入一个实体类, 而且注入的字段上正好有@JsonIgnore
注解, 那么这个字段是注入失败的, 可能有冲突的, 目前没有时间研究, 但是可以新建一个实体类专门用户接收参数的方法达到目的
回来补充一个问题
如果一个对外接口中出现了多个@RequestBody
, 那么就可能出现如下报错HttpMessageNotReadableException
:
{
"timestamp": "2020-07-05T09:51:20.019+00:00",
"status": 400,
"error": "Bad Request",
"trace": "org.springframework.http.converter.HttpMessageNotReadableException: I/O error while reading input message; nested exception is java.io.IOException: Stream closed\r\n\tat ...",
"message": "I/O error while reading input message; nested exception is java.io.IOException: Stream closed",
"path": "/pay/save"
}
但是具体的原因不明确, 查实了再来补充
我目前的解决方案就是一个对外接口不要使用多个@RequestBody
的参数, 防止序列化出现问题
还有个问题
{
"timestamp": "2020-07-07T13:01:00.488+00:00",
"status": 400,
"error": "Bad Request",
"trace": "org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public com.shreker.faith.response.ResponseObject com.shreker.faith.controller.PayController.list(com.shreker.faith.query.PayQueryObject)\r\n\tat ...",
"message": "Required request body is missing: public com.shreker.faith.response.ResponseObject com.shreker.faith.controller.PayController.list(com.shreker.faith.query.PayQueryObject)",
"path": "/pay/list"
}
这个问题给我的教训是: 使用了@RequestBody
参数, 那么参数不能为空, 否则会报此错误