You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Framework无法读取HTTP POST请求问题咨询

排查Spring无法读取前端POST提交JSON数组的问题

我之前也碰到过类似的请求解析失败的情况,咱们一步步拆解可能的问题点,逐个排查解决:

先检查前端请求的核心配置

  • 确认请求头的Content-Type
    Spring默认只识别application/json类型的JSON请求体,你的前端代码里headers部分没写完,大概率是这里漏了配置。比如在Angular里要明确设置:
    const headers = new HttpHeaders({
      'Content-Type': 'application/json'
    });
    
    如果用HttpClient的话,其实框架会自动帮序列化成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:09:20