作者:一一哥
一.HttpMessageConverter简介 1.概述现在我们进行web开发,一般都要设计成RESTful风格的API,通过json格式的数据进行交互。但是前端传入的 json 数据如何被解析成 Java 对象作为 API入参,后端返回结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个数据流转过程中,这是由谁来完成的呢?
其实这都是由HttpMessageConverter起到的作用!
2.HttpMessageConverter简介org.springframework.http.converter.HttpMessageConverter 是SpringMVC中提供的一个策略接口,它是一个转换器类,负责转换HTTP请求和响应,可以把对象自动转换为JSON(使用Jackson库或Gson库)或XML(使用Jackson XML或者JAXB2),对字符串默认使用UTF-8编码处理,一般情况下采用默认配置就可以。
该接口说明如下:Strategy interface that specifies a converter that can convert from and to HTTP requests and responses. 简单说就是 HTTP request (请求)和response (响应)的转换器。该接口里有5个方法,接收到请求时判断是否能读(canRead),能读则读(read);返回结果时判断是否能写(canWrite),能写则写(write),以及获取支持的 MediaType(application/json之类)方法。
boolean canRead(Class clazz, MediaType mediaType);
boolean canWrite(Class clazz, MediaType mediaType);
List getSupportedMediaTypes();
T read(Class> messageConverters) {
StringHttpMessageConverter stringConverter = new StringHttpMessageConverter();
stringConverter.setWriteAcceptCharset(false);
messageConverters.add(new ByteArrayHttpMessageConverter());
messageConverters.add(stringConverter);
messageConverters.add(new ResourceHttpMessageConverter());
messageConverters.add(new SourceHttpMessageConverter());
messageConverters.add(new AllEncompassingFormHttpMessageConverter());
if (romePresent) {
messageConverters.add(new AtomFeedHttpMessageConverter());
messageConverters.add(new RssChannelHttpMessageConverter());
}
if (jackson2XmlPresent) {
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.xml().applicationContext(this.applicationContext).build();
messageConverters.add(new MappingJackson2XmlHttpMessageConverter(objectMapper));
}
else if (jaxb2Present) {
messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
}
if (jackson2Present) {
ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper));
}
else if (gsonPresent) {
messageConverters.add(new GsonHttpMessageConverter());
}
}
从源码中可以看到,SpringMVC中使用Jackson库或Gson库来转换json字符串,使用使用Jackson XML或者JAXB2来转换xml。
而如果我们没有配置自己的 MessageConverter,SpringMVC 启动时就会调用 addDefaultHttpMessageConverters方法。
在Spring Boot中我们可以使用HttpMessageConverters添加HttpMessageConverter原生转换类或自定义转换类。
import org.springframework.boot.autoconfigure.web.HttpMessageConverters;
import org.springframework.context.annotation.*;
import org.springframework.http.converter.*;
@Configuration
public class MyConfiguration {
@Bean
public HttpMessageConverters customConverters() {
HttpMessageConverter additional = ...
HttpMessageConverter another = ...
return new HttpMessageConverters(additional, another);
}
}
从上面的代码示例中,我们看到可以把HttpMessageConverter添加到converters列表,通过这种方式覆盖默认的转换器列表(converters)。
5.自定义消息转换器的方式我们可以自定义自己的消息转换器来满足特定的需求,一般自定义消息转换器有两种方式:
- 1、使用spring或者第三方提供的现成的HttpMessageConverter;
- 2、自己重写一个HttpMessageConverter。
我们在之前的基础上,新建一个demo10,并将其改造成SpringBoot项目。
在SpringBoot项目中,当我们在控制器类或者其内部的方法上添加@RestController注解和@ResponseBody注解后,默认会使用jackson插件来返回json格式的数据,但是我们也可以利用fastjson为我们提供的FastJsonHttpMessageConverter来返回json格式的数据。
首先引入fastjson的依赖。
com.alibaba
fastjson
1.2.61
3.配置FastJsonHttpMessageConverter
我们可以通过实现WebMvcConfigurer接口,来配置FastJsonHttpMessageConverter,在Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.
我们创建如下的目录结构。
/**
*实现WebMvcConfigurer接口来配置FastJsonHttpMessageConverter,
*Spring Boot2.0版本以后推荐使用这种方式来进行web配置,这样不会覆盖掉Spring Boot的一些默认配置.
*/
@Configuration
public class CustomWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void extendMessageConverters(List
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?