Spring Boot中@RequestBody仅解析出0/Null值问题排查
这是Spring Boot开发中挺常见的问题,我帮你梳理几个最可能的原因和对应的解决办法:
POJO缺少无参构造函数
Spring自带的消息转换器(比如Jackson)默认依靠无参构造函数来实例化对象。如果你的Problem类只写了带参构造函数,没有显式定义无参的,反射实例化时就会出问题,最终属性都会是默认值(int类型默认0,对象类型默认null)。
解决办法:手动添加一个无参构造函数,或者用Lombok的@NoArgsConstructor注解自动生成。属性的getter/setter不符合规范或缺失
Jackson需要通过getter/setter来访问和设置属性值,如果你的Problem类里的属性没有对应的setter方法,或者方法名不符合JavaBean规范(比如属性是title,setter得是setTitle,不能是settitle或者其他奇怪的命名),解析时就没法给属性赋值,只能保留默认值。
偷懒的办法是用Lombok的@Data注解,它会自动生成符合规范的getter、setter、toString等方法。请求的Content-Type不匹配,或者控制器注解错误
举个例子:如果你用cURL发的是JSON格式的请求,但没加Content-Type: application/json的请求头,或者控制器方法的参数没加@RequestBody注解,Spring就不知道该用JSON转换器来解析请求体,自然没法正确赋值。
正确的cURL命令应该像这样:curl -X POST -H "Content-Type: application/json" -d '{"title":"测试问题","content":"这是问题内容"}' http://localhost:8080/api/problems控制器方法也要对应:
@PostMapping("/api/problems") public ResponseEntity<?> createProblem(@RequestBody Problem problem) { // 处理逻辑 return ResponseEntity.ok(problem); }请求字段和POJO属性名称不匹配
比如你的POJO里属性是problemId,但请求JSON里写的是problem_id或者id,默认情况下Jackson不会自动映射这种命名差异,导致对应属性无法被赋值,只能是默认值。
解决办法:可以给属性加@JsonProperty注解指定对应请求里的字段名,比如:@JsonProperty("problem_id") private Long problemId;也可以配置Jackson全局开启驼峰转下划线的映射,避免每个属性都加注解。
基本类型的默认值干扰
如果你的属性用的是基本类型(比如int、long),当请求里没有传这个字段时,Spring会自动给它赋值默认的0,而不是null。如果你需要区分“用户没传这个字段”和“用户传了0”,建议改用包装类型(Integer、Long)。
内容的提问来源于stack exchange,提问作者cbll

