Spring Boot使用@RequestPart传多类型参数上传文件报错
问题原因分析
这个异常的核心原因是Spring对非String类型的@RequestPart参数默认的媒体类型解析逻辑限制,具体细节如下:
当使用
@RequestPart接收Integer类型参数时,Spring默认会调用MappingJackson2HttpMessageConverter(JSON解析器)处理该参数,但前端发送的表单中,这个参数对应的part的Content-Type是application/octet-stream,而该转换器仅支持解析application/json类的媒体类型,无法处理二进制流类型,因此抛出HttpMediaTypeNotSupportedException异常。当把
number改为String类型时,Spring会切换使用StringHttpMessageConverter,这个转换器支持包括application/octet-stream在内的绝大多数文本类媒体类型,能直接将二进制流转换为字符串并适配为String类型参数,所以接口可以正常运行。在
@PostMapping中指定consumes属性为{MULTIPART_FORM_DATA_VALUE,APPLICATION_JSON_VALUE}仅声明了接口接收的整体请求类型为multipart/form-data,无法覆盖单个@RequestPart参数的媒体类型解析规则,因此无法解决问题。
如果要保留Integer类型参数,可参考两种解决方案:
- 前端发送number参数时,显式指定该part的Content-Type为
application/json,并将值以JSON格式传递(例如"123"); - 后端改用
@RequestParam接收number参数,该注解会自动处理表单中的普通文本参数,无需关注单个part的媒体类型。
内容的提问来源于stack exchange,提问作者Deng
相关产品推荐
相关产品推荐

