springboot 消息转换器

阅读数:51 评论数:0

跳转到新版页面

分类

python/Java

正文

一、消息转换器

在使用SpringMVC框架时,由前端发请求给后端,请求体中的内容就被称为消息。消息转换器就是实现消息与Java对象的相互转换,将请求体中的消息转为Java对象,反过来将Java对象转为响应体中的消息,所以其实SpringMVC中的@RequestBody和@ResponseBody注解就是干的这个事。

二、默认的消息转换器

在SpringBoot项目中由于导入了web-start依赖,在org.springframework.web.servlet.config.annotation包下面的WebMvcConfigurationSupport类,在这个下面有个addDefaultHttpMessageConverters方法就是设置默认的消息转换器集合。

    protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) {
        messageConverters.add(new ByteArrayHttpMessageConverter());
        messageConverters.add(new StringHttpMessageConverter());
        messageConverters.add(new ResourceHttpMessageConverter());
        messageConverters.add(new ResourceRegionHttpMessageConverter());
        if (!shouldIgnoreXml) {
            try {
                messageConverters.add(new SourceHttpMessageConverter());
            } catch (Throwable var3) {
            }
        }
 
        messageConverters.add(new AllEncompassingFormHttpMessageConverter());
        if (romePresent) {
            messageConverters.add(new AtomFeedHttpMessageConverter());
            messageConverters.add(new RssChannelHttpMessageConverter());
        }
 
        Jackson2ObjectMapperBuilder builder;
        if (!shouldIgnoreXml) {
            if (jackson2XmlPresent) {
                builder = Jackson2ObjectMapperBuilder.xml();
                if (this.applicationContext != null) {
                    builder.applicationContext(this.applicationContext);
                }
 
                messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.build()));
            } else if (jaxb2Present) {
                messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
            }
        }
 
        if (kotlinSerializationJsonPresent) {
            messageConverters.add(new KotlinSerializationJsonHttpMessageConverter());
        }
 
        if (jackson2Present) {
            builder = Jackson2ObjectMapperBuilder.json();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
 
            messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build()));
        } else if (gsonPresent) {
            messageConverters.add(new GsonHttpMessageConverter());
        } else if (jsonbPresent) {
            messageConverters.add(new JsonbHttpMessageConverter());
        }
 
        if (jackson2SmilePresent) {
            builder = Jackson2ObjectMapperBuilder.smile();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
 
            messageConverters.add(new MappingJackson2SmileHttpMessageConverter(builder.build()));
        }
 
        if (jackson2CborPresent) {
            builder = Jackson2ObjectMapperBuilder.cbor();
            if (this.applicationContext != null) {
                builder.applicationContext(this.applicationContext);
            }
 
            messageConverters.add(new MappingJackson2CborHttpMessageConverter(builder.build()));
        }
 
    }
MappingJackson2HttpMessageConverter 利用Jackson读写json格式数据
MappingJackson2HttpMessageConverter 读写form表单数据
Jaxb2RootElementHttpMessageConverter 使用jaxb读写xml格式数据
ByteArrayHttpMessageConverter 读写二进制格式数据
StringHttpMessageConverter 读写字符串格式数据
ResourceHttpMessageConverter 读写资源文件数据
SourceHttpMessageConverter 读写资源数据

三、SpringBoot配置自定义消息转换器

首先明白,因为是基于SpringBoot进行配置,所以配置都是基于配置类进行配置,配置消息转换器是在WebMvcConfigure接口实现类中重写configureMessageConverters、或者是重写extendMessageConverters方法

1、注册fastjson消息转换器

   @Bean
    public HttpMessageConverter fastJsonHttpMessageConverters() {
        //1.使用FastJson消息转换器对象
        FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
        //2.创建FastJson配置类对象
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        //3.通过配置类对象设置属性
        //"PrettyFormat"特性可以使得输出的JSON格式具有良好的可读性,即每个属性都单独占据一行,
        // 而不是将整个JSON字符串打印在一行中。这样做可以让JSON数据更加易读,方便人工阅读和调试
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //设置日期格式
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        //将Long类型数据转为字符串
        SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);
        //为FastJson添加序列化配置实例
        fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
        //将FastJson配置添加到fastJSON消息转换器中
        fastConverter.setFastJsonConfig(fastJsonConfig);
        HttpMessageConverter<?> converter = fastConverter;
        return converter;
    }
ToStringSerializer 转换为字符串
LongCodec 将Long类型的数据序列化为数字形式,默认的Long序列化方式。
JSONAwareSerializer 将实现了JSONAware接口的Java对象序列化为字符串形式
MapSerializer 将Map类型的数据序列化为JSON对象。
ListSerializer 将List类型的数据序列化为JSON数组。
ArraySerializer 将数组类型的数据序列化为JSON数组。
 @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //将fastJson消息转换器添加到消息转换器集合中
        converters.add(fastJsonHttpMessageConverters());
    }

2、configureMessageConverters与extendMessageConverters不同

前者会覆盖掉原有的消息转换器集合,而只保留当前的集合。




相关推荐

一、概述 Spring 中的处理器的实现多变,比如用户的处理器可以实现 Controller 接口或者 HttpRequestHandler 接口,也可以用 @RequestMapping 注解将方法