消息转换器,顾名思义就是对返回的消息,进行转换。下面常见的例子如下:
Spring MVC
框架中,将HTTP
请求信息转换为一个对象(@RequestBody
注解),将对象输出为HTTP响应信息(@ResponseBody
注解),都通过消息转换器HttpMessageConverter
来进行不同类型对象转换。- 在操作Redis数据库时,一般选用
RedisTemplate
或StringRedisTemplate
,如何将对象存储到redis
中,就涉及到序列化方式的选择,不同序列化方式,结果不一样,虽然序列化器不是转换器,但作用大体是一样的。 - 在使用
RabbitMQ
消息队列中,生产者需要将对象转换成消息写进消息队列,消费者需要将消息转换成对象读取,都离不开消息转换器MessageConverter
进行消息转换。
我们知道存储到数据到本地磁盘或者传输数据到网络另一端,都是以字节为最小单位进行的,所以在存储或传输对象时,最终是对象与具体字节数据相互转换,而类型转换器或序列化框架作用正是如此。
在实际开发过程中,可能会对返回的消息进行处理。
使用fastJson来配置消息转换器,过滤并修改返回的消息
1.导入依赖:
<!--fastjson依赖添加-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.31</version>
</dependency>
2.配置类编写
/**
* WebMvcConfigurerAdapter类是SpringBoot内部提供专门处理用户自行添加的配置,
* 里面不仅仅包含了修改视图的过滤还有其他很多的方法,还包括拦截器,过滤器,Cors配置等。
* Created by hengyang4 on 2018/7/9.
*/
@Configuration
public class FastJsonConfiguration extends WebMvcConfigurerAdapter{
/**
* 修改自定义消息转化器
* @param converters 消息转换器列表
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters){
//调用父类的配置
super.configureMessageConverters(converters);
//创建fastJson消息转换器
FastJsonHttpMessageConverter fastJsonConverter = new FastJsonHttpMessageConverter();
//创建配置类
FastJsonConfig fastJsonConfig = new FastJsonConfig();
//过滤并修改配置返回内容
fastJsonConfig.setSerializerFeatures(
//List字段如果为null,输出为[],而非null
//SerializerFeature.WriteNullListAsEmpty,
//字符类型字段如果为null,输出为"",而非null
SerializerFeature.WriteNullStringAsEmpty,
//Boolean字段如果为null,输出为falseJ,而非null
//SerializerFeature.WriteNullBooleanAsFalse,
//消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
SerializerFeature.DisableCircularReferenceDetect,
//是否输出值为null的字段,默认为false。
SerializerFeature.WriteMapNullValue
);
//处理中文乱码问题
List<MediaType> fastMediaTypes = new ArrayList<MediaType>();
fastMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);
fastJsonConverter.setSupportedMediaTypes(fastMediaTypes);
fastJsonConverter.setFastJsonConfig(fastJsonConfig);
//将fastjson添加到视图消息转换器列表内
converters.add(fastJsonConverter);
}
}
下面我们来介绍下常用的SerializerFeatures配置。
FastJson SerializerFeatures
WriteNullListAsEmpty :List字段如果为null,输出为[],而非null
WriteNullStringAsEmpty : 字符类型字段如果为null,输出为"",而非null
DisableCircularReferenceDetect :消除对同一对象循环引用的问题,默认为false(如果不配置有可能会进入死循环)
WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
WriteMapNullValue:是否输出值为null的字段,默认为false。
对结果进行验证:
我们这里使用了WriteNullStringAsEmpty,当返回信息里有null值时会自动转为"",我们来一起验证一下
表中数据第一条信息的name为null,我们来查询一下第一条用户信息
返回的name转为了空字符串"",这样,我们的fastJson消息转化器就配置成功了!