SpringBoot 中默认可以使用多个@RequestBody的接收参数吗?报I/O error while reading input message错怎么办?

最近的SpringBoot项目中post提交需要传多个参数,于是就凭直觉在方法里写了两个参数接收前端传过来的JSON对象

(@RequestBody A a, @RequestBody B b),但是报错后才发现问题所在。

报错内容如下:

I/O error while reading input message; nested exception is java.io.IOException: Stream closed]

查了下资料后才知道:SpringMVC中@RequestBody是读取的流的方式, 在取 body参数时第一个参数取到后把request.getInputStream()关闭,导致后面的@requestBody的对象拿取不到,就报错了。

又接着了解到,其实请求参数永远都是一个,因为一个request中只包含一个request body. 理解了这个,就会明白Spring MVC不支持多个@RequestBody。

然后看到网上的解决方法大概有以下几种:

  • 1、继承HandlerMethodArgumentResolver接口,重写supportsParameter()、resolveArgument()等方法,实现多RequestBody的解析。
  • 2、用Map<String, Object>接受request body,自己反序列化到各个entity中。
  • 3、创建一个新的entity,将两个entity都放进去。这是最简单的,但是不够“优雅”。

第一种、第三种都感觉太麻烦了,我用了第二种:

最后还是建议使用第二种或者第三种,因为前端只用传一个参数。强行去扩展原生的代码结构,往往是我们的程序设计有问题。

参考文献:

1、https://www.cnblogs.com/mahuan2/p/6008832.html

2、https://blog.csdn.net/w605283073/article/details/82119284

3、https://blog.csdn.net/qq_34791233/article/details/79978587

4、https://blog.csdn.net/liaonanfeng88/article/details/83115373

5、https://blog.csdn.net/qq_21358931/article/details/82251246

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QC班长

班长有话说:要是有瓶水喝就好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值