在 Spring Boot 中,MappingJackson2HttpMessageConverter 是处理 JSON 数据交互的核心组件。以下从三个维度细解析它的作用、工作原理以及如何使用:
1. 它是什么?(核心定位)
MappingJackson2HttpMessageConverter 是 Spring MVC 中 HttpMessageConverter 接口的一个具体实现类,充当了 Jackson 库与 Spring MVC 之间的"桥梁"。
- 功能 :它专门负责处理
application/json类型的数据,实现 Java 对象与 JSON 格式数据之间的双向自动转换(序列化与反序列化)。 - 底层依赖 :它内部封装了 Jackson 的
ObjectMapper实例,由ObjectMapper来实际执行具体的转换逻辑。 - 默认地位 :在 Spring Boot 中,只要项目引入了
spring-boot-starter-web(内部包含 Jackson 依赖),Spring Boot 的自动配置机制(JacksonAutoConfiguration)就会自动将其注册为首选的 JSON 消息转换器,实现"零配置"开箱即用。
2. 它是怎么工作的?(工作流程)
它的工作流程主要围绕 HTTP 请求的"读取"和"写入"两个方向展开:
- 请求处理(JSON → Java) :当客户端发送一个带有
Content-Type: application/json的请求时,Spring 会调用该转换器的read()方法。它会读取 HTTP 请求体中的 JSON 字符串,并利用ObjectMapper将其反序列化为 Controller 方法参数指定的 Java 对象(例如配合@RequestBody注解使用)。 - 响应处理(Java → JSON) :当 Controller 方法返回一个 Java 对象(通常配合
@ResponseBody或@RestController注解),且客户端请求头中的Accept包含application/json时,Spring 会调用该转换器的write()方法。它会将 Java 对象序列化为 JSON 字符串,写入 HTTP 响应体中,并自动设置响应头Content-Type: application/json。
3. 怎么用?(使用与定制方式)
在绝大多数日常开发中,你不需要手动实例化或注册这个转换器,只需关注以下常规用法和高级定制:
-
常规使用(自动触发) :
在 Controller 中使用
@RequestBody接收前端传来的 JSON,或直接将对象作为返回值配合@RestController返回,Spring 底层会自动调用MappingJackson2HttpMessageConverter完成转换。 -
全局定制(推荐方式) :
如果需要统一修改日期格式、忽略 null 值或更改字段命名策略,不建议 直接替换转换器,而是通过实现
Jackson2ObjectMapperBuilderCustomizer接口来优雅地定制全局配置。例如:java@Bean public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { return builder -> { // 全局忽略 null 值 builder.serializationInclusion(JsonInclude.Include.NON_NULL); // 统一日期格式 builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss"); }; } -
手动配置(非 Spring Boot 或特殊场景) :
如果在传统的 Spring MVC 项目中,或者需要完全接管消息转换器,可以实现
WebMvcConfigurer接口并重写configureMessageConverters方法,手动将MappingJackson2HttpMessageConverter添加到转换器列表中。