Spring控制器接收JQuery Ajax JSON数组报400错误求助
解决方案:Spring接收JQuery Ajax传递的JSON数组报400 Bad Request
核心问题分析
400错误的本质是请求格式与后端期望不匹配:前端没有正确发送JSON格式的请求体,或者后端没有配置正确的解析规则。你遇到的仅String类型能接收但内容是URL编码表单格式的情况,说明JQuery默认用了表单编码方式提交,而非纯JSON。
步骤1:修正前端JQuery Ajax配置
必须明确指定请求内容类型为application/json,并将数组转为JSON字符串发送:
// 示例JSON数组数据 var paymentData = [ {paymentId: "P001", amount: 150.50}, {paymentId: "P002", amount: 200.00} ]; $.ajax({ url: "/your-controller-path", method: "POST", contentType: "application/json;charset=utf-8", // 关键:指定JSON类型 data: JSON.stringify(paymentData), // 把数组转为标准JSON字符串 success: function(res) { console.log("处理成功:", res); }, error: function(xhr) { console.error("请求失败:", xhr.status); } });
步骤2:后端控制器正确配置参数
使用@RequestBody注解告诉Spring从请求体中解析JSON,直接绑定到List<PaymentDTO>:
@RestController @RequestMapping("/payments") public class PaymentController { // 接收JSON数组,必须加@RequestBody @PostMapping("/batch") public String receiveBatchPayments(@RequestBody List<PaymentDTO> paymentList) { // 业务处理逻辑 return "成功接收" + paymentList.size() + "条支付数据"; } }
步骤3:确保PaymentDTO符合JavaBean规范
DTO类需要提供无参构造器、字段的getter/setter,且字段名要和前端JSON的键名一致(大小写敏感):
import java.math.BigDecimal; public class PaymentDTO { private String paymentId; private BigDecimal amount; // 无参构造器:Jackson解析JSON必须 public PaymentDTO() {} // getter和setter方法 public String getPaymentId() { return paymentId; } public void setPaymentId(String paymentId) { this.paymentId = paymentId; } public BigDecimal getAmount() { return amount; } public void setAmount(BigDecimal amount) { this.amount = amount; } }
额外排查点
- Jackson版本兼容性:Spring 5.3.9默认依赖Jackson 2.12.x系列,你使用的2.17.1版本虽兼容,但需确保
jackson-core、jackson-databind、jackson-annotations三个包版本完全一致,避免依赖冲突。 - JSON格式合法性:检查前端发送的JSON是否有语法错误(比如多余逗号、引号不闭合),可通过浏览器开发者工具的Network面板查看请求体内容。
- 避免表单编码自动转换:如果未设置
contentType,JQuery会自动将数据转为application/x-www-form-urlencoded格式,导致后端无法解析JSON数组。
内容的提问来源于stack exchange,提问作者user3067524
相关产品推荐
相关产品推荐

