HttpMessageConverter 是 Spring 框架中用于处理 HTTP 消息转换的一个接口,它将请求和响应的 HTTP 消息(如 JSON、XML 等)转换为 Java 对象和将 Java 对象转换回 HTTP 消息。从 Spring 3.0 开始,这个接口被引入并用于增强 Spring MVC 中请求和响应的消息转换能力。
在 Spring MVC 中,HttpMessageConverter 的实现类负责将 HTTP 请求的消息体(request body)转换为 Java 对象(通常用于处理 @RequestBody 注解),以及将 Java 对象转换为 HTTP 响应的消息体(response body)(通常用于处理 @ResponseBody 注解或 @RestController 注解的控制器方法)。
Spring MVC 默认提供了几种 HttpMessageConverter 的实现,例如 MappingJackson2HttpMessageConverter(用于处理 JSON 数据)、Jaxb2RootElementHttpMessageConverter(用于处理 XML 数据)等。你可以通过配置来定制或扩展这些转换器,以满足特定的需求。
在 Spring 3.0 引入 HttpMessageConverter 后,你可以更方便地管理消息转换,并且可以轻松地添加对新的媒体类型的支持,只需要实现 HttpMessageConverter 接口并提供相应的转换器即可。
在 Spring Boot 中,这些配置进一步简化,因为 Spring Boot 提供了自动配置,它会自动检测和配置适合的消息转换器,这样你就可以专注于业务逻辑而不用关心底层的消息转换细节。
下面是一个简单的例子,展示了如何在 Spring MVC 中自定义一个 HttpMessageConverter:
java
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.stereotype.Component;
@Component
public class CustomHttpMessageConverter implements HttpMessageConverter {
private final MappingJackson2HttpMessageConverter jacksonConverter = new MappingJackson2HttpMessageConverter();
@Override
public boolean canRead(Class<?> clazz, MediaType mediaType) {
// 返回 true,表示这个转换器可以读取指定类型的对象
return true;
}
@Override
public boolean canWrite(Class<?> clazz, MediaType mediaType) {
// 返回 true,表示这个转换器可以写入指定类型的对象
return true;
}
@Override
public List<MediaType> getSupportedMediaTypes() {
// 返回支持的媒体类型列表
return Arrays.asList(MediaType.APPLICATION_JSON);
}
@Override
public Object read(Class<? extends Object> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
// 实现读取消息体的逻辑
return jacksonConverter.read(clazz, inputMessage);
}
@Override
public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
// 实现写入消息体的逻辑
jacksonConverter.write(t, contentType, outputMessage);
}
}
在这个例子中,我们创建了一个自定义的 HttpMessageConverter,它包装了 MappingJackson2HttpMessageConverter 来处理 JSON 数据的读写。然后,你可以将这个自定义的转换器注册到 Spring MVC 的配置中,以便它能够处理 HTTP 消息转换。
HttpMessageConverter 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象( 类型为 T)输出为响应信息
HttpMessageConverter接口定义的方法:
Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器 可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对 象,同时指定支持 MIME 类型(text/html,applaiction/json等)
Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器 是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型 在MediaType 中定义。
LIst getSupportMediaTypes():该转换器支持的媒体类
型。
T read(Class<? extends T> clazz,HttpInputMessage inputMessage): 将请求信息流转换为 T 类型的对象。
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将T类型的对象写到响应流中,同时指定相应的媒体类 型为 contentType。