Spring httpMessageConverter(一)
·
你想了解 Spring 中 HttpMessageConverter 的核心工作原理,这是理解 Spring MVC/ Spring Boot 处理 HTTP 请求和响应数据格式转换的关键。
一、HttpMessageConverter 核心定义
HttpMessageConverter 是 Spring 提供的一个核心接口,直译是「HTTP 消息转换器」,它的核心作用是:在 HTTP 请求 / 响应的报文(Message)和 Java 对象(Object)之间做双向转换。
简单类比:它就像一个「翻译官」,把前端发来的 JSON/XML 等格式的 HTTP 请求体,翻译成后端能识别的 Java 对象;也能把后端要返回的 Java 对象,翻译成前端能识别的 JSON/XML 等格式的 HTTP 响应体。
接口核心方法(简化版):
public interface HttpMessageConverter<T> {
// 判断当前转换器是否支持将请求报文转换为指定的Java类型
boolean canRead(Class<?> clazz, MediaType mediaType);
// 判断当前转换器是否支持将指定Java类型转换为响应报文
boolean canWrite(Class<?> clazz, MediaType mediaType);
// 获取当前转换器支持的媒体类型(如application/json、text/xml)
List<MediaType> getSupportedMediaTypes();
// 将HTTP请求报文转换为Java对象
T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException;
// 将Java对象转换为HTTP响应报文
void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;
}
二、工作原理(以 Spring MVC 为例)
1. 请求处理流程(Java 对象 <- HTTP 请求)

关键细节:
HandlerAdapter(如RequestMappingHandlerAdapter)会根据请求的Content-Type(如application/json)和 Controller 方法的参数类型,遍历容器中的HttpMessageConverter,找到第一个满足canRead()的转换器。- 例如:前端传 JSON 格式的请求体,
MappingJackson2HttpMessageConverter(JSON 转换器)会匹配Content-Type: application/json,并将 JSON 转为 Java 对象。
2. 响应处理流程(Java 对象 -> HTTP 响应)

关键细节:
- 会根据请求的
Accept头(如application/json)和返回值的类型,找到第一个满足canWrite()的转换器。 - 例如:返回
User对象,MappingJackson2HttpMessageConverter会将其转为 JSON 字符串,设置响应头Content-Type: application/json。
三、默认内置的 HttpMessageConverter
Spring 会默认注册一批常用的转换器,覆盖主流数据格式:
| 转换器类 | 支持的媒体类型 | 作用 |
|---|---|---|
| MappingJackson2HttpMessageConverter | application/json、application/*+json | JSON ↔ Java 对象(最常用) |
| StringHttpMessageConverter | text/plain、/ | 字符串 ↔ HTTP 报文 |
| FormHttpMessageConverter | application/x-www-form-urlencoded | 表单数据 ↔ MultiValueMap |
| Jaxb2RootElementHttpMessageConverter | application/xml、text/xml | XML ↔ Java 对象 |
四、自定义 HttpMessageConverter(实战示例)
如果默认转换器不满足需求(如自定义数据格式),可以手动配置:
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 1. 自定义JSON转换器(修改Jackson配置)
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
// 设置日期格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
// 忽略null字段
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
jsonConverter.setObjectMapper(objectMapper);
// 2. 添加自定义转换器到列表(顺序决定优先级)
converters.add(0, jsonConverter); // 放到第一位,优先级最高
// 3. 保留默认转换器(如String转换器)
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
}
}
总结
HttpMessageConverter是 Spring 处理 HTTP 报文和 Java 对象转换的核心接口,核心方法是read()(请求转换)和write()(响应转换)。- 工作时会根据
Content-Type(请求)/Accept(响应)头 + 数据类型,遍历并匹配第一个满足canRead()/canWrite()的转换器。 - Spring 内置了覆盖 JSON / 字符串 / 表单等主流格式的转换器,也支持自定义扩展,满足特殊格式转换需求。
更多推荐


所有评论(0)