消息转换器,顾名思义就是对返回的消息,进行转换。下面常见的例子如下:

  • Spring MVC框架中,将HTTP请求信息转换为一个对象(@RequestBody注解),将对象输出为HTTP响应信息(@ResponseBody注解),都通过消息转换器HttpMessageConverter来进行不同类型对象转换。
  • 在操作Redis数据库时,一般选用RedisTemplateStringRedisTemplate,如何将对象存储到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值时会自动转为"",我们来一起验证一下

springboot spel 短信模版 替换字符 spring消息转换器_序列化

表中数据第一条信息的name为null,我们来查询一下第一条用户信息

springboot spel 短信模版 替换字符 spring消息转换器_序列化_02

返回的name转为了空字符串"",这样,我们的fastJson消息转化器就配置成功了!