HTTP 消息转换

spring-web 模块包含 HttpMessageConverter 接口,用于通过 InputStreamOutputStream 读取和写入 HTTP 请求与响应的正文。 HttpMessageConverter 实例既可用于客户端(例如在 RestClient 中),也可用于服务端(例如在 Spring MVC REST 控制器中)。spring-doc.cadn.net.cn

框架中提供了主要媒体(MIME)类型的具體實現,默認情況下,這些實現會在客戶端註冊到 RestClientRestTemplate,在服務器端註冊到 RequestMappingHandlerAdapter(參見配置消息轉換器)。spring-doc.cadn.net.cn

下方描述了 HttpMessageConverter 的几种实现。 完整列表请参阅 HttpMessageConverter Javadoc。 对于所有转换器,默认使用一种媒体类型,但您可以通过设置 supportedMediaTypes 属性来覆盖它。spring-doc.cadn.net.cn

表1. HttpMessageConverter 实现类
消息转换器 描述

StringHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,可以从 HTTP 请求和响应中读取和写入 String 实例。 默认情况下,该转换器支持所有文本媒体类型(text/*),并以 Content-Typetext/plain 的格式进行写入。spring-doc.cadn.net.cn

FormHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,能够从 HTTP 请求和响应中读取和写入表单数据。 默认情况下,该转换器读取和写入 application/x-www-form-urlencoded 媒体类型。 表单数据从 MultiValueMap<String, String> 中读取,并写入到该类型中。 该转换器还可以将从 MultiValueMap<String, Object> 读取的多部分(multipart)数据进行写入(但不能读取)。 默认支持 multipart/form-data。 在写入表单数据时,还可以支持额外的多部分子类型。 更多详细信息,请参阅 FormHttpMessageConverter 的 Javadoc。spring-doc.cadn.net.cn

ByteArrayHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,能够从 HTTP 请求和响应中读取和写入字节数组。 默认情况下,该转换器支持所有媒体类型(*/*),并使用 Content-Typeapplication/octet-stream 进行写入。 您可以通过设置 supportedMediaTypes 属性并重写 getContentType(byte[]) 方法来覆盖此默认行为。spring-doc.cadn.net.cn

MarshallingHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,它使用 Spring 的 MarshallerUnmarshaller 抽象(来自 org.springframework.oxm 包)来读写 XML。 此转换器在使用前需要一个 MarshallerUnmarshaller。 你可以通过构造函数或 Bean 属性注入它们。 默认情况下,此转换器支持 text/xmlapplication/xmlspring-doc.cadn.net.cn

JacksonJsonHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,它通过使用 Jackson 的 JsonMapper 来读取和写入 JSON。 你可以通过 Jackson 提供的注解按需自定义 JSON 映射。 当你需要更精细的控制时(例如,需要为特定类型提供自定义的 JSON 序列化器/反序列化器),可以通过 JsonMapperJsonMapper 的构造函数参数注入一个自定义的 JsonMapper.Builder。 默认情况下,该转换器支持 application/json。这需要依赖 tools.jackson.core:jackson-databindspring-doc.cadn.net.cn

JacksonXmlHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,它通过使用 Jackson XML 扩展的 XmlMapper 来读取和写入 XML。 你可以根据需要通过 JAXB 或 Jackson 提供的注解来自定义 XML 映射。 当你需要更精细的控制时(例如,需要为特定类型提供自定义的 XML 序列化器/反序列化器),可以通过 XmlMapperJsonMapper 的构造函数参数注入一个自定义的 JsonMapper.Builder。 默认情况下,该转换器支持 application/xml。这需要依赖 tools.jackson.dataformat:jackson-dataformat-xmlspring-doc.cadn.net.cn

KotlinSerializationJsonHttpMessageConverterspring-doc.cadn.net.cn

一个使用 HttpMessageConverter 来读写 JSON 的 kotlinx.serialization 实现。 该转换器默认未被配置,因为它会与 Jackson 产生冲突。 开发人员必须将其作为额外的转换器进行配置,并置于 Jackson 转换器之前。spring-doc.cadn.net.cn

JacksonCborHttpMessageConverterspring-doc.cadn.net.cn

tools.jackson.dataformat:jackson-dataformat-cborspring-doc.cadn.net.cn

SourceHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,能够从 HTTP 请求和响应中读取和写入 javax.xml.transform.Source。 仅支持 DOMSourceSAXSourceStreamSource。 默认情况下,此转换器支持 text/xmlapplication/xmlspring-doc.cadn.net.cn

GsonHttpMessageConverterspring-doc.cadn.net.cn

一个使用“Google Gson”来读写 JSON 的 HttpMessageConverter 实现。 这需要依赖 com.google.code.gson:gsonspring-doc.cadn.net.cn

JsonbHttpMessageConverterspring-doc.cadn.net.cn

一个使用 Jakarta Json Bind API 来读写 JSON 的 HttpMessageConverter 实现。 这需要依赖 jakarta.json.bind:jakarta.json.bind-api 以及一个可用的实现。spring-doc.cadn.net.cn

ProtobufHttpMessageConverterspring-doc.cadn.net.cn

一种 HttpMessageConverter 实现,能够以二进制格式读写 Protobuf 消息,内容类型为 "application/x-protobuf"。这需要依赖 com.google.protobuf:protobuf-javaspring-doc.cadn.net.cn

ProtobufJsonFormatHttpMessageConverterspring-doc.cadn.net.cn

一个 HttpMessageConverter 实现,能够将 JSON 文档与 Protobuf 消息相互读写。 这需要依赖 com.google.protobuf:protobuf-java-utilspring-doc.cadn.net.cn