你想了解 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));
    }
}

总结

  1. HttpMessageConverter 是 Spring 处理 HTTP 报文和 Java 对象转换的核心接口,核心方法是 read()(请求转换)和 write()(响应转换)。
  2. 工作时会根据 Content-Type(请求)/Accept(响应)头 + 数据类型,遍历并匹配第一个满足 canRead()/canWrite() 的转换器。
  3. Spring 内置了覆盖 JSON / 字符串 / 表单等主流格式的转换器,也支持自定义扩展,满足特殊格式转换需求。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐