3.5 HttpMessageConverter
在Spring MVC中请求(@RequestBody
、RequestEntity
等)和返回(@Responsebody
、ResponseEntity
等)都是通过HttpMessageConverter
来实现数据转换的。
外部的请求数据通过HttpMessageConverter
转换成Java对象,而Java对象又通过HttpMessageConverter
转换成外部数据到返回中。在我们前面的例子中,web请求体中的Json数据通过MappingJackson2HttpMessageConverter
转换成Java对象,而Java对象也通过MappingJackson2HttpMessageConverter
转换成Json到返回体中。
HttpMessageConverter
会根据请求或返回的内容类型(Content-Type
如application/json
)来选择对应的HttpMessageConverter
对数据进行转换。
Spring MVC为我们自动注册了下列的HttpMessageConverter
:
-
ByteArrayHttpMessageConverter
:二进制数组转换 -
StringHttpMessageConverter
:字符串转换,支持的媒体类型: -
ResourceHttpMessageConverter
:org.springframework.core.io.Resource
类型转换 -
SourceHttpMessageConverter
:javax.xml.transform.Source
类型准换 -
各种Json库的
HttpMessageConverter
MappingJackson2HttpMessageConverter
:当jackson-databind
jar包在类路径时注册,当前请求体和返回体都是用它来做数据转换的MappingJackson2XmlHttpMessageConverter
:当jackson-dataformat-xml
jar包在类路径时注册Jaxb2RootElementHttpMessageConverter
:当jaxb-api
jar包在类路径时注册GsonHttpMessageConverter
:当gson
jar包在类路径时注册JsonbHttpMessageConverter
:当javax.json.bind-api
jar包在类路径时注册
我们也定义一个HttpMessageConverter
来演示它的功能。我们首先定义一个我们专门用来演示数据转换的类:
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class AnotherPerson {
private Long id;
private String name;
private Integer age;
}
继承AbstractHttpMessageConverter
(实现了HttpMessageConverter
接口)抽象类来定制:
public class AnotherPersonHttpMessageConverter extends AbstractHttpMessageConverter<AnotherPerson> {
public