@JsonRootName与@RequestBody配合失效问题求助
解决@JsonRootName与@RequestBody配合时字段为空的问题
问题核心
输入带根节点的JSON字符串时,@RequestBody绑定的UserDTO字段始终为空,但手动创建ObjectMapper并开启UNWRAP_ROOT_VALUE特性却能正常解析。
原因分析
- 缺少@JsonRootName注解:
UserDTO未标记根节点名称,Jackson无法识别要解包的目标根节点。 - 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凯布利斯
相关产品推荐
相关产品推荐

