SpringMVC中对HttpMessageConverter的理解

HttpMessageConverter流程简图:

 

 

FastJsonHttpMessageConverter类对Json报文的转换
@Configuration
public class JsonConfig {
    public JsonConfig(){}
    @Bean
    public HttpMessageConverters fastJsonHttpMessageConverter(){
        //1、创建FastJson信息转换对象
        FastJsonHttpMessageConverter fastConverter=new FastJsonHttpMessageConverter();
        //2、创建FastJsonConfig对象并设定序列化规则  序列化规则详见SerializerFeature类中,后面会讲
        FastJsonConfig fastJsonConfig= new FastJsonConfig();
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat,SerializerFeature.WriteNonStringKeyAsString);
//本人就坑在WriteNonStringKeyAsString 将不是String类型的key转换成String类型,否则前台无法将Json字符串转换成Json对象

        //3、中文乱码解决方案
        List<MediaType> fastMedisTypes = new ArrayList<MediaType>();
        //设定Json格式且编码为utf-8
        fastMedisTypes.add(MediaType.APPLICATION_JSON_UTF8);
        fastConverter.setSupportedMediaTypes(fastMedisTypes);
        //4、将转换规则应用于转换对象
        fastConverter.setFastJsonConfig(fastJsonConfig);
        return new HttpMessageConverters(fastConverter);

    }
}

序列化规则

        QuoteFieldNames,//输出key时是否使用双引号,默认为true 

        UseSingleQuotes,//使用单引号而不是双引号,默认为false

        WriteMapNullValue,//是否输出值为null的字段,默认为false 

        WriteEnumUsingToString,//Enum输出name()或者original,默认为false

        UseISO8601DateFormat,//Date使用ISO8601格式输出,默认为false

        WriteNullListAsEmpty,//List字段如果为null,输出为[],而非null 

        WriteNullStringAsEmpty,//字符类型字段如果为null,输出为"",而非null 
     
        WriteNullNumberAsZero,//数值字段如果为null,输出为0,而非null 

        WriteNullBooleanAsFalse,//Boolean字段如果为null,输出为false,而非null

        SkipTransientField,//如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true

        SortField,//按字段名称排序后输出。默认为false

        @Deprecated
        WriteTabAsSpecial,//把\t做转义输出,默认为false

        PrettyFormat,//结果是否格式化,默认为false

        WriteClassName,//序列化时写入类型信息,默认为false。反序列化是需用到

        DisableCircularReferenceDetect,//消除对同一对象循环引用的问题,默认为false

        WriteSlashAsSpecial,//对斜杠'/'进行转义

        BrowserCompatible,//将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false

        WriteDateUseDateFormat,//全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd";JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);

        NotWriteRootClassName,//暂不知,求告知

        DisableCheckSpecialChar,//一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false 

        BeanToArray; //暂不知,求告知

@RequestBody
作用: 

      i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;

      ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

使用时机:

A) GET、POST方式提时, 根据request header Content-Type的值来判断:

    application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
    multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
    其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:

    application/x-www-form-urlencoded, 必须;
    multipart/form-data, 不能处理;
    其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;

 

@ResponseBody

作用: 

      该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:

      返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

HttpMessageConverter类
ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
StringHttpMessageConverter:   负责读取字符串格式的数据和写出二进制格式的数据;
ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据; 
FormHttpMessageConverter:       负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;
MappingJacksonHttpMessageConverter:  负责读取和写入json格式的数据;
SouceHttpMessageConverter:          负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
Jaxb2RootElementHttpMessageConverter:  负责读取和写入xml 标签格式的数据;
AtomFeedHttpMessageConverter:              负责读取和写入Atom格式的数据;
RssChannelHttpMessageConverter:           负责读取和写入RSS格式的数据;

也可以自定义HttpMessageConverter,通过继承AbstractHttpMessageConverter类。

 

posted @ 2020-04-08 18:12  mufeng07  阅读(1794)  评论(0编辑  收藏  举报