Spring Boot处理注册请求时无法反序列化JSON数组报错如何解决
报错原因
- 核心问题是前端提交的请求体数据结构和后端
@RequestBody声明的参数类型不匹配:后端期望接收单个RegistrationRequest对象格式的JSON,但是前端实际提交的是JSON数组(请求体以[开头),Jackson反序列化时无法把数组转成单个对象,就抛出了这个异常。 - 常见触发场景:
- 表单序列化时错误把字段拼成了数组结构,没有包裹在单个对象里
- AJAX请求提交时误把表单字段数组直接传给了
data参数,没有做对象转换 - 错误设置请求头
Content-Type为application/json,但实际传的是表单序列化的数组格式数据
解决方案
前端修改(推荐,符合接口设计预期)
调整表单提交的参数结构,把所有表单字段放到同一个对象里再转成JSON字符串提交,示例代码:
// 错误写法(提交数组触发报错) let formData = $("form").serializeArray(); $.ajax({ url: "/registration", type: "POST", contentType: "application/json", data: JSON.stringify(formData), success: res => {} }) // 正确写法(转成单个对象提交) let formArr = $("form").serializeArray(); let formObj = {}; formArr.forEach(item => { formObj[item.name] = item.value; }); $.ajax({ url: "/registration", type: "POST", contentType: "application/json", data: JSON.stringify(formObj), success: res => {} })
如果是原生表单提交不想用AJAX,直接去掉后端接口参数的@RequestBody注解,用实体类或者@RequestParam接收表单参数即可,不需要传JSON格式。
后端修改(适配现有前端提交逻辑,不推荐)
如果前端逻辑无法修改,且提交的是只有一个元素的数组,可以把后端接口的参数类型改成List<RegistrationRequest>,取列表第一个元素处理即可,示例:
// 修改前 @PostMapping public String register(@RequestBody RegistrationRequest request) { // 原有业务逻辑 } // 修改后 @PostMapping public String register(@RequestBody List<RegistrationRequest> requestList) { RegistrationRequest request = requestList.get(0); // 原有业务逻辑 }
内容的提问来源于stack exchange,提问作者user15394835
相关产品推荐
相关产品推荐

