Spring Framework无法读取HTTP POST请求问题咨询
排查Spring无法读取前端POST提交JSON数组的问题
我之前也碰到过类似的请求解析失败的情况,咱们一步步拆解可能的问题点,逐个排查解决:
先检查前端请求的核心配置
- 确认请求头的
Content-Type
Spring默认只识别application/json类型的JSON请求体,你的前端代码里headers部分没写完,大概率是这里漏了配置。比如在Angular里要明确设置:
如果用HttpClient的话,其实框架会自动帮序列化成JSON并加正确头,但手动设置时千万别写错类型。const headers = new HttpHeaders({ 'Content-Type': 'application/json' }); - 检查请求体的序列化是否正确
你代码里records的类型是string[],但实际要传的是JSON对象数组——这就矛盾了!应该把对象数组直接传给HttpClient(框架会自动转成JSON字符串),或者手动用JSON.stringify(yourObjectArray)转成字符串,但要确保类型匹配,别把对象数组当成字符串数组传。
正确的前端示例代码应该是这样:deleteTableData(schema: string, tableName: string, records: any[]): Observable<number> { if (records.length > 0) { const headers = new HttpHeaders({ 'Content-Type': 'application/json' }); return this.http.post<number>(`/api/${schema}/${tableName}`, records, { headers }); } return of(0); }
再排查Spring后端的接收逻辑
- Controller方法必须加
@RequestBody注解
要接收JSON数组,必须用@RequestBody告诉Spring把请求体解析成对应的对象集合,比如:@PostMapping("/{schema}/{tableName}") public ResponseEntity<Integer> handleDelete( @PathVariable String schema, @PathVariable String tableName, @RequestBody List<FundRecord> records ) { // 处理删除逻辑,返回影响行数 return ResponseEntity.ok(fundService.batchDelete(records)); } - 实体类字段要和JSON对应
前端JSON的字段是大写下划线格式(比如FUND_CODE),后端实体类要么用@JsonProperty指定别名,要么把字段名改成完全一致的格式:
另外注意日期字段,比如public class FundRecord { @JsonProperty("FUND_CODE") private String fundCode; @JsonProperty("PORTF_CODE") private String portfCode; @JsonProperty("CLIENT_START_DT") private String clientStartDt; // 其他字段的getter/setter }9998-12-31这种极端日期,要确保Jackson能正常解析——如果实体类用LocalDate类型,Spring默认支持yyyy-MM-dd格式,一般没问题,但如果有自定义日期序列化器要检查配置。 - 查看后端日志定位具体异常
开启Spring的DEBUG级别日志,看有没有HttpMessageNotReadableException这类异常,里面会明确告诉你解析失败的原因:比如字段不匹配、JSON格式错误、日期解析失败等,这是最直接的排查线索。
快速验证方法
用Postman或者curl直接把你要提交的JSON数组发去后端接口,看能不能正常接收:
curl -X POST -H "Content-Type: application/json" -d '[{"FUND_CODE":"testFUND","PORTF_CODE":"testcode","CLIENT_STAT":null,"CLIENT_LOCAL_CURR":null,"CLIENT_START_DT":"2017-04-06","CLIENT_END_DT":"9998-12-31","CREATED_USER_ID":"testuser","CREATED_DATETIME":"2017-05-04","LAST_UPDATE_USER":null,"LAST_UPDATE_DT":null}]' http://your-backend-url/api/your-schema/your-table
如果Postman能正常接收,那问题肯定在前端的请求配置;如果Postman也失败,那就是后端的Controller或实体类配置有问题。
内容的提问来源于stack exchange,提问作者xzk
相关产品推荐
相关产品推荐

