升级Spring 6后@RequestParam接收form-data参数报缺失异常
Spring 6 + Tomcat 10 下multipart/form-data请求@RequestParam接收失败的解决方案
问题根源
Spring 6移除了CommonsMultipartResolver,默认改用StandardServletMultipartResolver,而Tomcat 10基于Servlet 5.0,和Tomcat 9依赖的Servlet 4.0在multipart参数解析逻辑上存在差异。移除旧Resolver后若未完成适配配置,会导致普通参数无法被正确识别。
适配解决方案
1. 配置StandardServletMultipartResolver
Spring Boot 3/Spring 6会自动配置该Resolver,纯Spring MVC项目需手动注册:
@Bean public StandardServletMultipartResolver multipartResolver() { return new StandardServletMultipartResolver(); }
同时补充Servlet层面的multipart配置:
- 若用XML配置(web.xml):
<servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>multipartConfigElement</param-name> <param-value> <multipart-config> <max-file-size>10MB</max-file-size> <max-request-size>20MB</max-request-size> </multipart-config> </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
- 若用Java配置Servlet:
@Bean public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() { ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(new DispatcherServlet(), "/"); registration.setMultipartConfig(new MultipartConfigElement( null, 10*1024*1024, 20*1024*1024, 0 )); return registration; }
2. 修正前端请求格式
jQuery发送multipart请求时,必须用FormData对象,且禁止手动设置contentType:
var formData = new FormData(); formData.append('fname', 'test.txt'); formData.append('data', file); // file为选中的文件对象 formData.append('id', '123'); $.ajax({ url: '/your-endpoint', type: 'POST', data: formData, processData: false, contentType: false, // 让浏览器自动生成带boundary的Content-Type,不要手动设置 success: function(response) { // 处理响应 } });
手动设置contentType: "multipart/form-data"会缺失boundary参数,导致后端解析失败。
3. 后端参数接收调整
若上述配置后仍无法接收id参数,可改用@RequestPart替代@RequestParam:
@PostMapping("/your-endpoint") public ResponseEntity<?> handleRequest( @RequestPart("fname") String fname, @RequestPart("data") MultipartFile data, @RequestPart("id") String id) { // 业务逻辑处理 return ResponseEntity.ok().build(); }
Servlet 5.0中multipart请求的普通参数会被视为part,@RequestPart可兼容这种解析逻辑。
4. 检查Tomcat配置
确保Tomcat 10未禁用multipart处理,可在context.xml中确认:
<Context> <MultipartConfig maxFileSize="10485760" maxRequestSize="20971520" /> </Context>
内容的提问来源于stack exchange,提问作者Neets
相关产品推荐
相关产品推荐

