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

@JsonRootName与@RequestBody配合失效问题求助

解决@JsonRootName与@RequestBody配合时字段为空的问题

问题核心

输入带根节点的JSON字符串时,@RequestBody绑定的UserDTO字段始终为空,但手动创建ObjectMapper并开启UNWRAP_ROOT_VALUE特性却能正常解析。

原因分析

  1. 缺少@JsonRootName注解:UserDTO未标记根节点名称,Jackson无法识别要解包的目标根节点。
  2. Spring Boot配置路径错误:原配置中spring.serialization和spring.deserialization不属于Jackson的配置节点,导致反序列化特性未生效。

解决方案

1. 给UserDTO添加@JsonRootName注解

指定JSON中的根节点名称(对应输入JSON里的user):

@JsonRootName("user")
public class UserDTO {
    private String name;
    private String email;
    private Location location;

    // 必须提供无参构造方法,Jackson反序列化依赖它
    public UserDTO() {}

    // getter、setter方法省略
}

class Location {
    private String street;
    private String city;

    public Location() {}

    // getter、setter方法省略
}

2. 修正Spring Boot的Jackson配置

根据Spring Boot版本调整配置路径:

  • Spring Boot 2.x(适配Jackson 2.11/2.14):
spring:
  jackson:
    deserialization:
      UNWRAP_ROOT_VALUE: true # 开启反序列化根节点解包
    serialization:
      WRAP_ROOT_VALUE: true # 可选,序列化时自动添加根节点
  • Spring Boot 3.x:
spring:
  jackson:
    deserialization:
      unwrap-root-value: true
    serialization:
      wrap-root-value: true

3. 验证效果

修改后无需手动创建ObjectMapper,Spring MVC会自动使用配置好的实例处理@RequestBody绑定:

@RestController
@RequestMapping("/test")
public class TestController {
    @PostMapping(value = "/get", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    public boolean getInfo(@RequestBody UserDTO userDTO) {
        // 此时userDTO的name、email等字段已正确赋值
        return userDTO.getName() != null;
    }
}

关键说明

  • 确保UserDTO及嵌套类(如Location)有无参构造方法,否则Jackson无法完成反序列化。
  • 避免版本冲突:Spring Boot与Jackson版本需匹配(例如Spring Boot 2.4对应Jackson 2.11,Spring Boot 2.6对应Jackson 2.14)。

内容的提问来源于stack exchange,提问作者K凯布利斯

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:13:13