You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:59:58