@EnableWebMvc搭配PUT请求与form-urlencoded参数引发异常问题
问题原因分析
- @EnableWebMvc的配置影响:添加该注解后,Spring Boot会禁用
WebMvcAutoConfiguration自动配置类,完全采用原生Spring MVC的配置逻辑。 - 原生Spring MVC参数解析规则:原生Spring MVC默认仅对POST请求的
application/x-www-form-urlencoded格式请求体做解析,并将参数存入request parameter map;对于PUT请求,默认不会处理这类格式的请求体,导致@RequestParam无法获取参数,抛出MissingServletRequestParameterException。 - Spring Boot自动配置的差异:
WebMvcAutoConfiguration中默认注册了HttpPutFormContentFilter过滤器,该过滤器会拦截PUT/PATCH请求,将请求体中的form参数解析到request parameter map中,因此移除@EnableWebMvc后PUT请求能正常获取参数。
解决办法
办法一:手动注册HttpPutFormContentFilter
在Spring配置类中手动注册该过滤器,让PUT请求的form参数能被解析:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Bean public HttpPutFormContentFilter httpPutFormContentFilter() { return new HttpPutFormContentFilter(); } // 其他MVC定制配置... }
办法二:改用@RequestBody接收参数
直接通过@RequestBody结合MultiValueMap接收PUT请求的form参数:
@PutMapping("/test3") public String test3(@RequestBody MultiValueMap<String, String> params){ String id = params.getFirst("id"); int k = Integer.parseInt(params.getFirst("k")); return id+","+k; }
办法三:移除@EnableWebMvc,用WebMvcConfigurer定制配置
如果不需要完全接管Spring MVC配置,建议移除@EnableWebMvc,改用@Configuration+WebMvcConfigurer定制MVC规则,保留Spring Boot的自动配置(包括HttpPutFormContentFilter的自动注册):
@Configuration public class WebConfig implements WebMvcConfigurer { // 在这里添加MVC定制逻辑,比如拦截器、视图解析器等... }
内容的提问来源于stack exchange,提问作者idleman
相关产品推荐
相关产品推荐

