最近的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都放进去。这是最简单的,但是不够“优雅”。
第一种、第三种都感觉太麻烦了,我用了第二种:
最后还是建议使用第二种或者第三种,因为前端只用传一个参数。强行去扩展原生的代码结构,往往是我们的程序设计有问题。
上一篇:
Servlet的几个方法介绍(init() 、service()、doGet() 、doPost()、destroy()、getServletConfig()、getServletInfo())
下一篇:
设计模式六大原则(4):接口隔离原则
Java局部变量可以重名吗 java局部变量的值存在哪里
局部变量何为局部变量?局部变量就是方法里定义的变量。局部变量仅作用在局部区域中,从定义开始到大括号或者return结束,生命周期短。局部变量存储:基本数据类型变量放在栈中,引用数据类型放在堆中局部变量可以先定义再初始化,也可以定义的同时初始化,局部变量没有默认初始值。class test{
public static void main (String args[]) {