Spring Boot DELETE接口报Required String parameter 'xxx'不存在如何解决?
问题产生原因
这个问题本质是Servlet规范和Spring Web的默认参数解析规则导致的:
- Servlet规范默认仅会对POST请求的
application/x-www-form-urlencoded、multipart/form-data类型请求体做参数解析,把表单参数放入请求的ParameterMap中,DELETE、PUT等请求方法的表单请求体默认不会被解析 - @RequestParam注解默认是从请求的ParameterMap中读取参数,所以POST请求时你放在form-data里的参数可以被正常读取,换成DELETE请求后,请求体的参数没有被解析进ParameterMap,就会报参数缺失的错误。
解决方法
以下是4种可行的解决方案,可根据业务场景选择:
- 参数放到URL查询参数中(最推荐,符合REST设计规范)
调用时直接把参数拼在请求地址后,格式为/testing?requestId=xxx,@RequestParam可以直接读取到URL上的查询参数,不需要修改接口代码。 - 参数改为路径变量
修改接口定义,把参数嵌入请求路径:
@RequestMapping(value = "/testing/{requestId}", method = RequestMethod.DELETE) public ResponseEntity<Object> testing(@PathVariable(value = "requestId", required = true) String requestId){ return new ResponseEntity<Object>(requestId, HttpStatus.OK); }
调用时请求地址格式为/testing/你的requestId值即可。
- 配置服务端开启非POST请求的表单参数解析
在Spring Boot的application.properties/application.yml中添加如下配置,让Tomcat解析DELETE、PUT等请求的表单参数:
# 允许Tomcat解析DELETE、PUT方法的表单请求体 server.tomcat.parse-body-methods=POST,PUT,DELETE
配置完成后不需要修改接口代码,原有的DELETE接口就可以正常读取form-data里的参数。
- 改用@RequestBody接收JSON格式参数
如果参数较多,建议把参数放在JSON请求体中传递,修改接口如下:
@RequestMapping(value = "/testing", method = RequestMethod.DELETE) public ResponseEntity<Object> testing(@RequestBody Map<String, Object> params){ String requestId = params.get("requestId").toString(); return new ResponseEntity<Object>(requestId, HttpStatus.OK); }
调用时把请求体格式改为JSON,传入{"requestId":"xxx"}即可。
内容的提问来源于stack exchange,提问作者Candra Juliana Sakti
相关产品推荐
相关产品推荐

