错误记录:Current request is not a multipart request

springboot 报错:Current request is not a multipart request
这个一般是controller是带有上传文件的服务,类似@RequestParam MultipartFile[] file

解决:

首先检查请求头中的Content-Type是否设置对,如果把Content-Type设置成application/json是不行的

需要把Content-Type设置成multipart/form-data或着去掉Content-Type。
注意,去掉Content-Type,我自己测试的时候是不行的,但看很多网友都说可以,在此记录一下。

还有一种可能就是你的请求url,是https的,而你用了http,也会报这个错误。

反思

通过spring源码,我们看到报这个错误的地方在RequestParamMethodArgumentResolver类的handleMissingValue方法中。
在这里插入图片描述
看上图,只有servletRequest为null,或者后面的MultipartResolutionDelegate.isMultipartRequest(servletRequest)是false,才会报这个错,我们再看看MultipartResolutionDelegate.isMultipartRequest这个方法的逻辑:
在这里插入图片描述
看到这里,是不是很清晰了,就是简单的判断请求头里的Content-Type,是不是以“multipart/”开头的

而且,其实正常的请求,是进不到这个handleMissingValue方法的,我们再往前看这个方法的调用的地方:

在AbstractNamedValueMethodArgumentResolver类的resolveArgument方法中,有下图这个逻辑:
在这里插入图片描述
我们可以看到,只有当入参的值arg为空,并且也没有默认值,还要必传的情况下,才会报这个错。

所以,我们可以得到这个结论:凡是报这个Current request is not a multipart request错的,其本质都是服务解析不到入参值,且这个值必传,也没有默认值。
Content-Type设置错会这样,https误写成http也会这样,或许还有其他可能,但原理都是一样的。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值