Spring DELETE接口报Bad Request:List参数ids不存在如何解决
问题原因
- 前后端传参结构不匹配
前端传递的是包裹了ids字段的对象{ids: [1,2,3]},但后端@RequestBody直接声明接收List<Long>类型,Spring会将请求体JSON的根节点当做列表解析,找不到对应结构就会抛出参数不存在的错误。 - 前端未将请求参数序列化为JSON字符串
直接把JS对象传给$.ajax的data参数时,jQuery默认会将对象转换为表单键值对格式,就算声明了contentType也不会自动转JSON,后端无法正确解析。 dataType参数配置错误$.ajax的dataType是指定期望后端返回的数据类型,合法值为json、xml、html等,你填写的application/json是MIME类型,属于非法配置,可能触发请求异常。
解决方案
两种方案二选一即可:
方案一:修改前端传参适配现有后端接口
前端直接传递数组作为JSON根节点,无需包裹ids字段,同时修正参数序列化和配置项:
var ids = [1,2,3]; $.ajax({ type: 'DELETE', url: _host + '/delete', data: JSON.stringify(ids), // 直接序列化数组为JSON字符串 contentType: 'application/json; charset=utf-8', dataType: 'json', // 修正dataType配置 async: false, success: function (result) { } });
后端原有代码不需要修改。
方案二:修改后端接收结构适配现有前端传参
后端新增接收参数的结构,匹配前端传递的带ids字段的对象:
// 方式1:用Map接收 @DeleteMapping(value = "/delete") public @ResponseBody String delete(@RequestBody Map<String, List<Long>> param){ List<Long> ids = param.get("ids"); // 执行业务逻辑 } // 方式2:自定义DTO接收 @Data public class DeleteIdsReq { private List<Long> ids; } @DeleteMapping(value = "/delete") public @ResponseBody String delete(@RequestBody DeleteIdsReq req){ List<Long> ids = req.getIds(); // 执行业务逻辑 }
同时前端补充JSON序列化配置:
var ids = [1,2,3]; var dataIds = {ids: ids}; $.ajax({ type: 'DELETE', url: _host + '/delete', data: JSON.stringify(dataIds), // 序列化为JSON字符串 contentType: 'application/json; charset=utf-8', dataType: 'json', async: false, success: function (result) { } });
内容的提问来源于stack exchange,提问作者AppleT
相关产品推荐
相关产品推荐

