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

Spring Boot中@RequestBody仅解析出0/Null值问题排查

排查Spring Boot Rest控制器解析POJO只得到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 06:22:32