HttpMessageConverter 接口在 Spring 框架中有多个实现类,这些实现类负责处理不同媒体类型(如 JSON、XML、Atom、RSS 等)的 HTTP 消息转换。以下是一些常见的 HttpMessageConverter 实现类:
MappingJackson2HttpMessageConverter:
这个类用于处理 JSON 格式的请求和响应消息。它使用 Jackson 库将 Java 对象序列化为 JSON 字符串,以及将 JSON 字符串反序列化为 Java 对象。
Jaxb2RootElementHttpMessageConverter:
这个类用于处理 XML 格式的请求和响应消息。它使用 JAXB(Java Architecture for XML Binding)库将 Java 对象映射到 XML,以及将 XML 映射回 Java 对象。
RssChannelHttpMessageConverter 和 AtomFeedHttpMessageConverter:
这两个类分别用于处理 RSS 和 Atom 格式的 feed 数据。
StringHttpMessageConverter:
这个类用于处理简单的文本消息。它可以将字符串直接写入响应或从请求中读取字符串。
ByteArrayHttpMessageConverter:
这个类用于处理字节数组格式的请求和响应消息。它可以直接处理二进制数据。
FormHttpMessageConverter:
这个类用于处理表单数据的请求和响应。它可以将表单数据转换为 MultiValueMap<String, String> 对象,也可以将这样的对象转换为表单数据。
ResourceHttpMessageConverter:
这个类用于处理资源文件的请求和响应,比如图片、文件下载等。
MappingJackson2XmlHttpMessageConverter:
这个类使用 Jackson 库将 Java 对象序列化为 XML,以及将 XML 反序列化为 Java 对象。它不同于 Jaxb2RootElementHttpMessageConverter,因为它不依赖于 JAXB,而是使用 Jackson 的 XML 模块。
GsonHttpMessageConverter(需要额外添加依赖):
这个类使用 Gson 库来处理 JSON 格式的请求和响应消息。
ProtobufHttpMessageConverter(需要额外添加依赖):
这个类用于处理 Protocol Buffers 格式的请求和响应消息。
在 Spring Boot 中,这些转换器通常会自动配置,但你也可以通过实现 WebMvcConfigurer 接口并重写 extendMessageConverters 方法来定制或添加自定义的 HttpMessageConverter 实现。
例如,要添加自定义的 JSON 转换器,你可以这样做:
java
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
MappingJackson2HttpMessageConverter customConverter = new MappingJackson2HttpMessageConverter();
// 自定义配置,比如设置日期格式、序列化配置等
converters.add(customConverter);
}
}
在这个例子中,我们创建了一个自定义的 MappingJackson2HttpMessageConverter 并将其添加到了现有的转换器列表中。这允许我们覆盖默认的 JSON 转换器行为,以满足特定的需求。
HttpMessageConverter 类在 Spring 框架中有多个常见的实现类,这些实现类负责将 HTTP 请求和响应的消息体转换为 Java 对象,以及将 Java 对象转换为 HTTP 消息体。以下是一些常见的 HttpMessageConverter 实现类:
StringHttpMessageConverter:
这个转换器可以将请求和响应的消息体直接处理为字符串(String)类型。
ByteArrayHttpMessageConverter:
这个转换器可以将请求和响应的消息体处理为字节数组(byte[])类型,适用于二进制数据的传输。
ResourceHttpMessageConverter:
这个转换器用于处理资源文件的请求和响应,比如图片、文件下载等。它将资源文件作为 Resource 对象进行转换。
SourceHttpMessageConverter:
这个转换器用于处理基于 JAXP Source 类型的消息体,通常用于处理 XML 数据。
Jaxb2RootElementHttpMessageConverter:
这个转换器使用 JAXB(Java Architecture for XML Binding)来将请求和响应的消息体转换为 Java 对象,或者将 Java 对象转换为 XML 格式的消息体。
MappingJackson2HttpMessageConverter:
这个转换器使用 Jackson 库来将请求和响应的消息体转换为 JSON 格式,或者将 JSON 格式的消息体转换为 Java 对象。它是处理 JSON 数据时最常用的转换器之一。
GsonHttpMessageConverter:
这个转换器使用 Gson 库来将请求和响应的消息体转换为 JSON 格式,或者将 JSON 格式的消息体转换为 Java 对象。它是处理 JSON 数据的另一种选择。
ProtobufHttpMessageConverter:
这个转换器用于处理 Protocol Buffers(Protobuf)格式的消息体。它将 Protobuf 数据转换为 Java 对象,或者将 Java 对象转换为 Protobuf 数据。
AtomFeedHttpMessageConverter 和 RssChannelHttpMessageConverter:
这两个转换器分别用于处理 Atom 和 RSS 格式的 feed 数据。
FormHttpMessageConverter:
这个转换器用于处理表单数据的请求和响应。它可以将表单数据转换为 MultiValueMap<String, String> 对象,或者将这样的对象转换为表单数据。
Jaxb2RootElementHttpMessageConverter 和 MappingJackson2XmlHttpMessageConverter:
这两个转换器都用于处理 XML 数据,但使用的库不同。前者使用 JAXB,后者使用 Jackson 的 XML 模块。
在 Spring Boot 中,这些 HttpMessageConverter 实现类通常会自动配置,以满足常见的需求。然而,你也可以通过实现 WebMvcConfigurer 接口并重写 configureMessageConverters 方法来定制或添加自定义的 HttpMessageConverter 实现。例如:
java
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 创建一个自定义的 MappingJackson2HttpMessageConverter
MappingJackson2HttpMessageConverter customConverter = new MappingJackson2HttpMessageConverter();
// 对 customConverter 进行自定义配置
// 将自定义的转换器添加到转换器列表中
converters.add(customConverter);
}
}
在上面的代码中,我们创建了一个自定义的 MappingJackson2HttpMessageConverter 并将其添加到了 Spring MVC 的转换器列表中。这样,我们就可以覆盖默认的 JSON 转换器行为,以满足特定的需求。