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
相关产品推荐
相关产品推荐

