@RequestBody 仅触发请求体反序列化,实际由 MappingJackson2HttpMessageConverter 和 Jackson 配置(如 application.yml、@JsonFormat、@JsonProperty 等)决定行为,常见问题需通过 Jackson 注解或全局配置解决。

@RequestBody 注解本身不直接控制 JSON 反序列化行为,它只是告诉 Spring:这个方法参数应从 HTTP 请求体中读取并反序列化。真正决定如何反序列化的,是 Spring MVC 配置的 HttpMessageConverter(尤其是 MappingJackson2HttpMessageConverter),以及 Jackson 的配置和注解。
1. 依赖 Jackson 库并确保自动注册
Spring Boot 项目默认引入 spring-boot-starter-web,会自动配置 Jackson(jackson-databind 等)。此时 MappingJackson2HttpMessageConverter 会被注册为默认的 JSON 处理器。只要请求头包含 Content-Type: application/json,Spring 就会用它来反序列化请求体。
- 确保类路径下有 Jackson 核心依赖(Spring Boot 默认满足)
- 无需手动注册 converter,除非你自定义了 WebMvcConfigurer
- 若手动配置,需确保
MappingJackson2HttpMessageConverter在 converters 列表中且支持application/json
2. 控制反序列化行为靠 Jackson 配置和注解
@RequestBody 背后的 Jackson 反序列化过程受以下因素影响:
-
全局 Jackson 配置:如在
application.yml中设置:spring.jackson.deserialization.accept-single-value-as-array=true
或通过Jackson2ObjectMapperBuilder自定义 ObjectMapper -
类级别注解:如
@JsonDeserialize(using = MyCustomDeserializer.class)、@JsonIgnoreProperties(ignoreUnknown = true) -
字段级别注解:如
@JsonProperty("user_name")、@JsonFormat(pattern = "yyyy-MM-dd")、@NotNull(配合@Valid使用) -
构造函数/Setter 约束:Jackson 默认调用无参构造器;若只有带参构造器,需加
@JsonCreator
3. 处理常见反序列化问题
当 @RequestBody 绑定失败(如 400 Bad Request),通常不是注解问题,而是 Jackson 解析异常:
立即学习“Java免费学习笔记(深入)”;
-
字段名不匹配 → 用
@JsonProperty显式指定 JSON key -
日期格式错误 → 加
@JsonFormat(pattern = "...")或配置全局 date-format -
空值/缺失字段报错 → 类属性加
@JsonProperty(required = false),或设字段为包装类型(Integer而非int) -
忽略未知字段 → 在类上加
@JsonIgnoreProperties(ignoreUnknown = true) -
需要校验 → 方法参数加
@Valid,实体类字段加@NotBlank等 Bean Validation 注解
4. 自定义反序列化逻辑(进阶)
如果标准行为不够用,可编写自定义 JsonDeserializer:
- 继承
JsonDeserializer<yourtype></yourtype>,重写deserialize() - 在目标字段或类上用
@JsonDeserialize(using = YourDeserializer.class) - 或注册为全局反序列化器(通过
SimpleModule.addDeserializer(...)注入 ObjectMapper)
本质上,@RequestBody 是一个“触发器”,它把反序列化任务交给已配置好的 Jackson 流程。调优重点始终在 Jackson 层 —— 配置、注解、自定义处理器,而非 @RequestBody 本身。


















