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

Spring Boot读取POST请求体异常:获取ID始终返回0的问题排查

Spring Boot POST接口请求体ID始终为0的问题排查

我正在学习Spring Boot,目前已实现两个可用的GET接口:

  • 返回硬编码数据的GET请求——可用
  • 通过路径参数ID返回数据的GET请求——可用

现在为了学习,我尝试实现一个从请求体获取ID的POST接口(已知此方式非最佳实践,通常ID应放在路径中),但代码始终返回ID为0,想排查问题所在。以下是我的代码:

Controller代码

@RestController
public class spannerController {

  @Autowired
  CdRequestService cdRequestService;

  @GetMapping("/getData")
  public Optional<Request> getData() {
    Optional<Request> request;
    request = requestService.getRequest(101);

    return request;
  }


  @GetMapping("/getData/{id}")
  public Optional<Request> getData(@PathVariable("id") int id) {
    Optional<Request> request;
    request = requestService.getRequest(id);

    return request;
  }

  @PostMapping(value = "/getData",
      consumes = MediaType.APPLICATION_JSON_VALUE,
      produces = MediaType.APPLICATION_JSON_VALUE)
  public void getDataPost(@RequestBody PostRequest request) {
    System.out.println(request);
    System.out.println(request.getId());
  }
}

PostRequest实体类代码

public class PostRequest {

   int id;

  public PostRequest() {
  }
  public PostRequest(int id) {
    this.id = id;
  }

  public int getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

}

问题原因

核心问题出在PostRequest类的setter方法与成员变量类型不匹配:

  • 成员变量id是基本类型int,但对应的setId方法参数是包装类型Integer
  • Spring使用的JSON反序列化工具(如Jackson)会严格遵循JavaBean规范匹配属性setter,参数类型不匹配会导致反序列化时无法正确调用setId方法,id始终保持默认值0。

解决方案

可以通过以下两种方式修复:

方案1:统一setter参数类型与成员变量类型

把setId方法的参数改为int,和成员变量类型一致:

public void setId(int id) {
    this.id = id;
}

方案2:将成员变量改为包装类型

把id的类型改为Integer,这样setter参数用Integer也能正常匹配,同时默认值会变为null,更便于排查反序列化是否成功:

public class PostRequest {

   Integer id;

  public PostRequest() {
  }
  public PostRequest(Integer id) {
    this.id = id;
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

}

额外优化建议

可以给id字段添加@JsonProperty("id")注解,明确指定JSON字段名,避免因字段名大小写或序列化配置问题导致的匹配失败:

@JsonProperty("id")
private int id;

同时确保请求发送时:

  • 请求体格式为正确的JSON:{"id": 123}
  • 请求头Content-Type设置为application/json

内容的提问来源于stack exchange,提问作者Jay93

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 15:53:14