在日常的开发中遇到了一种问题 - 没办法对Controller注入多个参数,每个Controller的RequestMap方法参数只能注入一个的RequestBody。但是又经常使用多个参数,通常我们的做法是将那几个DTO重新组合成一个新的DTO,最常见的例子就是我们在请求分页数据的时候,每次要嘛将请求参数和分页参数组合成一个新的DTO,要嘛请求参数的DTO继承分页参数的DTO,这样使我们没办法从方法上直观的看到这个请求接口的参数性质。我再网上找到了一种多参数注入的方式,是一个大神写的,他自己写了一个注解(@MultiRequestBody),应该会有人看过这篇文章,我顺便也把链接附上SpringBoot Controller 中使用多个@RequestBody的正确姿势 ,我在这边再次膜拜大神,这篇文章初期给了我很大的帮助,感谢。
人总是不满足的,因为在业务当中要加很多参数的判空处理,所以我就想着有没有什么工具可以自动帮我们做参数的校验,所以就找到了BindingRequest,配合@Valid使用十分好用。但是大神的@MultiRequestBody没办法配合@Valid、BindingRequest使用,所以就很蛋疼。抱着我一定要用上可以自动参数校验的多个RequestBody注入的想法,便开始趟雷了。
趟雷的时候发现报的异常我很熟悉,异常叫什么我忘记了,但是记得内容是request.getInputStream()里面没有值了,所以RequestBody拿不到值(异常引起的原因是request.getInputStream()里面的值只能取一次,顺便说一下request.getReader()里面的值也只能取一次,可能是request.getReader()使用了request.getInputStream())。也很幸运,因为之前遇到过这个异常,感觉会不会是第二个RequestBody从request里面去取值的时候因为request.getInputStream()的值被第一个拿走了,所以第二个RequestBody拿不到值,所以就网上找了一个工具,先将request.getInputStream()拿出来,然后再把它放到一个新的request里面,我们去使用这个新的request,不就解决了这个问题了。
现在就开始把这些骚操作串起来。
1、加入依赖
<!--@valid -->
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>
2、加入重置request里面的值的工具
附上大神的文章链接解决在Filter中读取Request中的流后, 然后在Controller中@RequestBody的参数无法注入而导致 400 错误
大神的代码中我们只需要里面将request.getInputStream()重置这部分。
(1)写好request重置的工具
import org.apache.co